Skip to content

Commit 587f81f

Browse files
committed
[Internal] Make letter spacing dependent on text size in CollapsingTextHelper
1 parent 2c2a26c commit 587f81f

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

lib/java/com/google/android/material/internal/CollapsingTextHelper.java

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -696,17 +696,6 @@ private void calculateOffsets(final float fraction) {
696696
textPaint.setColor(getCurrentCollapsedTextColor());
697697
}
698698

699-
if (collapsedLetterSpacing != expandedLetterSpacing) {
700-
textPaint.setLetterSpacing(
701-
lerp(
702-
expandedLetterSpacing,
703-
collapsedLetterSpacing,
704-
fraction,
705-
AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR));
706-
} else {
707-
textPaint.setLetterSpacing(collapsedLetterSpacing);
708-
}
709-
710699
// Calculates paint parameters for shadow layer.
711700
currentShadowRadius = lerp(expandedShadowRadius, collapsedShadowRadius, fraction, null);
712701
currentShadowDx = lerp(expandedShadowDx, collapsedShadowDx, fraction, null);
@@ -1068,7 +1057,6 @@ private void calculateUsingTextSize(final float fraction, boolean forceRecalcula
10681057
newTypeface = collapsedTypeface;
10691058
} else {
10701059
newTextSize = expandedTextSize;
1071-
newLetterSpacing = expandedLetterSpacing;
10721060
newTypeface = expandedTypeface;
10731061
if (isClose(fraction, /* targetValue= */ 0)) {
10741062
// If we're close to the expanded text size, snap to it and use a scale of 1
@@ -1080,6 +1068,11 @@ private void calculateUsingTextSize(final float fraction, boolean forceRecalcula
10801068
/ expandedTextSize;
10811069
}
10821070

1071+
newLetterSpacing = lerp(
1072+
expandedLetterSpacing, collapsedLetterSpacing,
1073+
1f, collapsedTextSize / expandedTextSize,
1074+
scale);
1075+
10831076
float textSizeRatio = collapsedTextSize / expandedTextSize;
10841077
// This is the size of the expanded bounds when it is scaled to match the
10851078
// collapsed text size
@@ -1289,11 +1282,11 @@ public void setStaticLayoutBuilderConfigurer(
12891282
}
12901283

12911284
/**
1292-
* Returns true if {@code value} is 'close' to it's closest decimal value. Close is currently
1285+
* Returns true if {@code value1} is 'close' to {@code value2}. Close is currently
12931286
* defined as it's difference being < 0.00001.
12941287
*/
1295-
private static boolean isClose(float value, float targetValue) {
1296-
return Math.abs(value - targetValue) < 0.00001f;
1288+
private static boolean isClose(float value1, float value2) {
1289+
return Math.abs(value1 - value2) < 0.00001f;
12971290
}
12981291

12991292
public ColorStateList getExpandedTextColor() {
@@ -1336,6 +1329,22 @@ private static float lerp(
13361329
return AnimationUtils.lerp(startValue, endValue, fraction);
13371330
}
13381331

1332+
private static float lerp(
1333+
float outputStart, float outputEnd,
1334+
float inputStart, float inputEnd,
1335+
float inputValue) {
1336+
if (isClose(inputEnd, inputStart)) {
1337+
if (isClose(outputEnd, outputStart)) {
1338+
return outputStart;
1339+
} else {
1340+
throw new RuntimeException("\"input\" range is empty, but \"output\" is not");
1341+
}
1342+
}
1343+
1344+
float value = (inputValue - inputStart) / (inputEnd - inputStart);
1345+
return outputStart + (outputEnd - outputStart) * value;
1346+
}
1347+
13391348
private static boolean rectEquals(@NonNull Rect r, int left, int top, int right, int bottom) {
13401349
return !(r.left != left || r.top != top || r.right != right || r.bottom != bottom);
13411350
}

0 commit comments

Comments
 (0)