Improve TextView.onMeasure() for multiline text.
Previously, measures all paragraph for deciding view width.
However, in case AT_MOST measurment, we can stop calculating measure if
the measured paragraph already exceeds the upper limit.
Bug: 64389125
Test: bit CtsWidgetTestCases:*
Test: CorePerfTest. Here is a result before and after this patch.
Before:
INSTRUMENTATION_STATUS: measure_AtMost_median=50332114
INSTRUMENTATION_STATUS: measure_Exactly_median=28276317
INSTRUMENTATION_STATUS: measure_Unspecified_median=50193036
After:
INSTRUMENTATION_STATUS: measure_AtMost_median=28475187
INSTRUMENTATION_STATUS: measure_Exactly_median=26944710
INSTRUMENTATION_STATUS: measure_Unspecified_median=50880088
Change-Id: I2a39eb39817a8f845c4fa2e174a905a2d057096e
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index ecefce9..d612fc7 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -152,6 +152,17 @@
*/
public static float getDesiredWidth(CharSequence source, int start, int end, TextPaint paint,
TextDirectionHeuristic textDir) {
+ return getDesiredWidthWithLimit(source, start, end, paint, textDir, Float.MAX_VALUE);
+ }
+ /**
+ * Return how wide a layout must be in order to display the
+ * specified text slice with one line per paragraph.
+ *
+ * If the measured width exceeds given limit, returns limit value instead.
+ * @hide
+ */
+ public static float getDesiredWidthWithLimit(CharSequence source, int start, int end,
+ TextPaint paint, TextDirectionHeuristic textDir, float upperLimit) {
float need = 0;
int next;
@@ -163,6 +174,9 @@
// note, omits trailing paragraph char
float w = measurePara(paint, source, i, next, textDir);
+ if (w > upperLimit) {
+ return upperLimit;
+ }
if (w > need)
need = w;