Merge "AutoSize TextView - correct pixel transformations" into oc-dev

This commit is contained in:
Andrei Stingaceanu
2017-05-24 09:16:42 +00:00
committed by Android (Google) Code Review

View File

@@ -746,17 +746,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
// Default value for the step size in pixels. // Default value for the step size in pixels.
private static final int DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX = 1; private static final int DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX = 1;
// Use this to specify that any of the auto-size configuration int values have not been set. // Use this to specify that any of the auto-size configuration int values have not been set.
private static final int UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1; private static final float UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1f;
// Auto-size text type. // Auto-size text type.
private int mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_NONE; private int mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_NONE;
// Specify if auto-size text is needed. // Specify if auto-size text is needed.
private boolean mNeedsAutoSizeText = false; private boolean mNeedsAutoSizeText = false;
// Step size for auto-sizing in pixels. // Step size for auto-sizing in pixels.
private int mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; private float mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Minimum text size for auto-sizing in pixels. // Minimum text size for auto-sizing in pixels.
private int mAutoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; private float mAutoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Maximum text size for auto-sizing in pixels. // Maximum text size for auto-sizing in pixels.
private int mAutoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; private float mAutoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Contains a (specified or computed) distinct sorted set of text sizes in pixels to pick from // Contains a (specified or computed) distinct sorted set of text sizes in pixels to pick from
// when auto-sizing text. // when auto-sizing text.
private int[] mAutoSizeTextSizesInPx = EmptyArray.INT; private int[] mAutoSizeTextSizesInPx = EmptyArray.INT;
@@ -987,9 +987,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
CharSequence text = ""; CharSequence text = "";
CharSequence hint = null; CharSequence hint = null;
boolean password = false; boolean password = false;
int autoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; float autoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
int autoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; float autoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
int autoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; float autoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
int inputType = EditorInfo.TYPE_NULL; int inputType = EditorInfo.TYPE_NULL;
a = theme.obtainStyledAttributes( a = theme.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.TextView, defStyleAttr, defStyleRes); attrs, com.android.internal.R.styleable.TextView, defStyleAttr, defStyleRes);
@@ -1363,17 +1363,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
break; break;
case com.android.internal.R.styleable.TextView_autoSizeStepGranularity: case com.android.internal.R.styleable.TextView_autoSizeStepGranularity:
autoSizeStepGranularityInPx = a.getDimensionPixelSize(attr, autoSizeStepGranularityInPx = a.getDimension(attr,
UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE); UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break; break;
case com.android.internal.R.styleable.TextView_autoSizeMinTextSize: case com.android.internal.R.styleable.TextView_autoSizeMinTextSize:
autoSizeMinTextSizeInPx = a.getDimensionPixelSize(attr, autoSizeMinTextSizeInPx = a.getDimension(attr,
UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE); UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break; break;
case com.android.internal.R.styleable.TextView_autoSizeMaxTextSize: case com.android.internal.R.styleable.TextView_autoSizeMaxTextSize:
autoSizeMaxTextSizeInPx = a.getDimensionPixelSize(attr, autoSizeMaxTextSizeInPx = a.getDimension(attr,
UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE); UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break; break;
@@ -1692,14 +1692,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
if (autoSizeMinTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) { if (autoSizeMinTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) {
autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension( autoSizeMinTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP, DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP,
displayMetrics); displayMetrics);
} }
if (autoSizeMaxTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) { if (autoSizeMaxTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) {
autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension( autoSizeMaxTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP, DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP,
displayMetrics); displayMetrics);
@@ -1744,11 +1744,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
break; break;
case AUTO_SIZE_TEXT_TYPE_UNIFORM: case AUTO_SIZE_TEXT_TYPE_UNIFORM:
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
final int autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension( final float autoSizeMinTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP, DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP,
displayMetrics); displayMetrics);
final int autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension( final float autoSizeMaxTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP, DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP,
displayMetrics); displayMetrics);
@@ -1797,11 +1797,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) { int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) {
if (supportsAutoSizeText()) { if (supportsAutoSizeText()) {
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
final int autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension( final float autoSizeMinTextSizeInPx = TypedValue.applyDimension(
unit, autoSizeMinTextSize, displayMetrics); unit, autoSizeMinTextSize, displayMetrics);
final int autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension( final float autoSizeMaxTextSizeInPx = TypedValue.applyDimension(
unit, autoSizeMaxTextSize, displayMetrics); unit, autoSizeMaxTextSize, displayMetrics);
final int autoSizeStepGranularityInPx = (int) TypedValue.applyDimension( final float autoSizeStepGranularityInPx = TypedValue.applyDimension(
unit, autoSizeStepGranularity, displayMetrics); unit, autoSizeStepGranularity, displayMetrics);
validateAndSetAutoSizeTextTypeUniformConfiguration(autoSizeMinTextSizeInPx, validateAndSetAutoSizeTextTypeUniformConfiguration(autoSizeMinTextSizeInPx,
@@ -1843,8 +1843,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
// Convert all to sizes to pixels. // Convert all to sizes to pixels.
for (int i = 0; i < presetSizesLength; i++) { for (int i = 0; i < presetSizesLength; i++) {
presetSizesInPx[i] = (int) TypedValue.applyDimension(unit, presetSizes[i], presetSizesInPx[i] = Math.round(TypedValue.applyDimension(unit,
displayMetrics); presetSizes[i], displayMetrics));
} }
} }
@@ -1886,7 +1886,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) * @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int)
*/ */
public int getAutoSizeStepGranularity() { public int getAutoSizeStepGranularity() {
return mAutoSizeStepGranularityInPx; return Math.round(mAutoSizeStepGranularityInPx);
} }
/** /**
@@ -1899,7 +1899,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int) * @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
*/ */
public int getAutoSizeMinTextSize() { public int getAutoSizeMinTextSize() {
return mAutoSizeMinTextSizeInPx; return Math.round(mAutoSizeMinTextSizeInPx);
} }
/** /**
@@ -1912,7 +1912,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int) * @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
*/ */
public int getAutoSizeMaxTextSize() { public int getAutoSizeMaxTextSize() {
return mAutoSizeMaxTextSizeInPx; return Math.round(mAutoSizeMaxTextSizeInPx);
} }
/** /**
@@ -1955,8 +1955,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
* *
* @throws IllegalArgumentException if any of the params are invalid * @throws IllegalArgumentException if any of the params are invalid
*/ */
private void validateAndSetAutoSizeTextTypeUniformConfiguration(int autoSizeMinTextSizeInPx, private void validateAndSetAutoSizeTextTypeUniformConfiguration(float autoSizeMinTextSizeInPx,
int autoSizeMaxTextSizeInPx, int autoSizeStepGranularityInPx) { float autoSizeMaxTextSizeInPx, float autoSizeStepGranularityInPx) {
// First validate. // First validate.
if (autoSizeMinTextSizeInPx <= 0) { if (autoSizeMinTextSizeInPx <= 0) {
throw new IllegalArgumentException("Minimum auto-size text size (" throw new IllegalArgumentException("Minimum auto-size text size ("
@@ -2022,18 +2022,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
// Calculate sizes to choose from based on the current auto-size configuration. // Calculate sizes to choose from based on the current auto-size configuration.
int autoSizeValuesLength = (int) Math.ceil( int autoSizeValuesLength = (int) Math.ceil(
(mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx) (mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx)
/ (float) mAutoSizeStepGranularityInPx); / mAutoSizeStepGranularityInPx);
// Also reserve a slot for the max size if it fits. // Also reserve a slot for the max size if it fits.
if ((mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx) if ((mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx)
% mAutoSizeStepGranularityInPx == 0) { % mAutoSizeStepGranularityInPx == 0) {
autoSizeValuesLength++; autoSizeValuesLength++;
} }
mAutoSizeTextSizesInPx = new int[autoSizeValuesLength]; int[] autoSizeTextSizesInPx = new int[autoSizeValuesLength];
int sizeToAdd = mAutoSizeMinTextSizeInPx; float sizeToAdd = mAutoSizeMinTextSizeInPx;
for (int i = 0; i < autoSizeValuesLength; i++) { for (int i = 0; i < autoSizeValuesLength; i++) {
mAutoSizeTextSizesInPx[i] = sizeToAdd; autoSizeTextSizesInPx[i] = Math.round(sizeToAdd);
sizeToAdd += mAutoSizeStepGranularityInPx; sizeToAdd += mAutoSizeStepGranularityInPx;
} }
mAutoSizeTextSizesInPx = cleanupAutoSizePresetSizes(autoSizeTextSizesInPx);
} }
mNeedsAutoSizeText = true; mNeedsAutoSizeText = true;