Skip to content

Commit 9ce14ae

Browse files
pubiqqleticiarossi
authored andcommitted
[Slider] Refactor track icon tinting
Resolves #4521 GIT_ORIGIN_REV_ID=674feb5f080ee2ea79245b17314d852893ece7d7 PiperOrigin-RevId: 712886599
1 parent 76d4e85 commit 9ce14ae

File tree

1 file changed

+92
-21
lines changed

1 file changed

+92
-21
lines changed

lib/java/com/google/android/material/slider/BaseSlider.java

Lines changed: 92 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -330,10 +330,14 @@ abstract class BaseSlider<
330330
private int trackCornerSize;
331331
private int trackInsideCornerSize;
332332
@Nullable private Drawable trackIconActiveStart;
333+
private boolean trackIconActiveStartMutated = false;
333334
@Nullable private Drawable trackIconActiveEnd;
335+
private boolean trackIconActiveEndMutated = false;
334336
@Nullable private ColorStateList trackIconActiveColor;
335337
@Nullable private Drawable trackIconInactiveStart;
338+
private boolean trackIconInactiveStartMutated = false;
336339
@Nullable private Drawable trackIconInactiveEnd;
340+
private boolean trackIconInactiveEndMutated = false;
337341
@Nullable private ColorStateList trackIconInactiveColor;
338342
@Px private int trackIconSize;
339343
private int labelPadding;
@@ -1992,13 +1996,29 @@ public void setTrackInsideCornerSize(@Px int cornerSize) {
19921996
* @see #getTrackIconActiveStart()
19931997
*/
19941998
public void setTrackIconActiveStart(@Nullable Drawable icon) {
1995-
if (this.trackIconActiveStart == icon) {
1999+
if (icon == trackIconActiveStart) {
19962000
return;
19972001
}
1998-
this.trackIconActiveStart = icon;
2002+
2003+
trackIconActiveStart = icon;
2004+
trackIconActiveStartMutated = false;
2005+
updateTrackIconActiveStart();
19992006
invalidate();
20002007
}
20012008

2009+
private void updateTrackIconActiveStart() {
2010+
if (trackIconActiveStart != null) {
2011+
if (!trackIconActiveStartMutated && trackIconActiveColor != null) {
2012+
trackIconActiveStart = DrawableCompat.wrap(trackIconActiveStart).mutate();
2013+
trackIconActiveStartMutated = true;
2014+
}
2015+
2016+
if (trackIconActiveStartMutated) {
2017+
DrawableCompat.setTintList(trackIconActiveStart, trackIconActiveColor);
2018+
}
2019+
}
2020+
}
2021+
20022022
/**
20032023
* Sets the active track start icon.
20042024
*
@@ -2037,13 +2057,29 @@ public Drawable getTrackIconActiveStart() {
20372057
* @see #getTrackIconActiveEnd()
20382058
*/
20392059
public void setTrackIconActiveEnd(@Nullable Drawable icon) {
2040-
if (this.trackIconActiveEnd == icon) {
2060+
if (icon == trackIconActiveEnd) {
20412061
return;
20422062
}
2043-
this.trackIconActiveEnd = icon;
2063+
2064+
trackIconActiveEnd = icon;
2065+
trackIconActiveEndMutated = false;
2066+
updateTrackIconActiveEnd();
20442067
invalidate();
20452068
}
20462069

2070+
private void updateTrackIconActiveEnd() {
2071+
if (trackIconActiveEnd != null) {
2072+
if (!trackIconActiveEndMutated && trackIconActiveColor != null) {
2073+
trackIconActiveEnd = DrawableCompat.wrap(trackIconActiveEnd).mutate();
2074+
trackIconActiveEndMutated = true;
2075+
}
2076+
2077+
if (trackIconActiveEndMutated) {
2078+
DrawableCompat.setTintList(trackIconActiveEnd, trackIconActiveColor);
2079+
}
2080+
}
2081+
}
2082+
20472083
/**
20482084
* Sets the active track end icon.
20492085
*
@@ -2107,10 +2143,13 @@ public int getTrackIconSize() {
21072143
* @see #getTrackIconActiveColor()
21082144
*/
21092145
public void setTrackIconActiveColor(@Nullable ColorStateList color) {
2110-
if (this.trackIconActiveColor == color) {
2146+
if (color == trackIconActiveColor) {
21112147
return;
21122148
}
2113-
this.trackIconActiveColor = color;
2149+
2150+
trackIconActiveColor = color;
2151+
updateTrackIconActiveStart();
2152+
updateTrackIconActiveEnd();
21142153
invalidate();
21152154
}
21162155

@@ -2135,13 +2174,29 @@ public ColorStateList getTrackIconActiveColor() {
21352174
* @see #getTrackIconInactiveStart()
21362175
*/
21372176
public void setTrackIconInactiveStart(@Nullable Drawable icon) {
2138-
if (this.trackIconInactiveStart == icon) {
2177+
if (icon == trackIconInactiveStart) {
21392178
return;
21402179
}
2141-
this.trackIconInactiveStart = icon;
2180+
2181+
trackIconInactiveStart = icon;
2182+
trackIconInactiveStartMutated = false;
2183+
updateTrackIconInactiveStart();
21422184
invalidate();
21432185
}
21442186

2187+
private void updateTrackIconInactiveStart() {
2188+
if (trackIconInactiveStart != null) {
2189+
if (!trackIconInactiveStartMutated && trackIconInactiveColor != null) {
2190+
trackIconInactiveStart = DrawableCompat.wrap(trackIconInactiveStart).mutate();
2191+
trackIconInactiveStartMutated = true;
2192+
}
2193+
2194+
if (trackIconInactiveStartMutated) {
2195+
DrawableCompat.setTintList(trackIconInactiveStart, trackIconInactiveColor);
2196+
}
2197+
}
2198+
}
2199+
21452200
/**
21462201
* Sets the inactive track start icon.
21472202
*
@@ -2180,13 +2235,29 @@ public Drawable getTrackIconInactiveStart() {
21802235
* @see #getTrackIconInactiveEnd()
21812236
*/
21822237
public void setTrackIconInactiveEnd(@Nullable Drawable icon) {
2183-
if (this.trackIconInactiveEnd == icon) {
2238+
if (icon == trackIconInactiveEnd) {
21842239
return;
21852240
}
2186-
this.trackIconInactiveEnd = icon;
2241+
2242+
trackIconInactiveEnd = icon;
2243+
trackIconInactiveEndMutated = false;
2244+
updateTrackIconInactiveEnd();
21872245
invalidate();
21882246
}
21892247

2248+
private void updateTrackIconInactiveEnd() {
2249+
if (trackIconInactiveEnd != null) {
2250+
if (!trackIconInactiveEndMutated && trackIconInactiveColor != null) {
2251+
trackIconInactiveEnd = DrawableCompat.wrap(trackIconInactiveEnd).mutate();
2252+
trackIconInactiveEndMutated = true;
2253+
}
2254+
2255+
if (trackIconInactiveEndMutated) {
2256+
DrawableCompat.setTintList(trackIconInactiveEnd, trackIconInactiveColor);
2257+
}
2258+
}
2259+
}
2260+
21902261
/**
21912262
* Sets the inactive track end icon.
21922263
*
@@ -2224,10 +2295,13 @@ public Drawable getTrackIconInactiveEnd() {
22242295
* @see #getTrackIconInactiveColor()
22252296
*/
22262297
public void setTrackIconInactiveColor(@Nullable ColorStateList color) {
2227-
if (this.trackIconInactiveColor == color) {
2298+
if (color == trackIconInactiveColor) {
22282299
return;
22292300
}
2230-
this.trackIconInactiveColor = color;
2301+
2302+
trackIconInactiveColor = color;
2303+
updateTrackIconInactiveStart();
2304+
updateTrackIconInactiveEnd();
22312305
invalidate();
22322306
}
22332307

@@ -2596,36 +2670,33 @@ private void drawTrackIcons(
25962670

25972671
// draw track start icons
25982672
calculateBoundsAndDrawTrackIcon(
2599-
canvas, activeTrackBounds, trackIconActiveStart, trackIconActiveColor, true);
2673+
canvas, activeTrackBounds, trackIconActiveStart, true);
26002674
calculateBoundsAndDrawTrackIcon(
2601-
canvas, inactiveTrackBounds, trackIconInactiveStart, trackIconInactiveColor, true);
2675+
canvas, inactiveTrackBounds, trackIconInactiveStart, true);
26022676
// draw track end icons
26032677
calculateBoundsAndDrawTrackIcon(
2604-
canvas, activeTrackBounds, trackIconActiveEnd, trackIconActiveColor, false);
2678+
canvas, activeTrackBounds, trackIconActiveEnd, false);
26052679
calculateBoundsAndDrawTrackIcon(
2606-
canvas, inactiveTrackBounds, trackIconInactiveEnd, trackIconInactiveColor, false);
2680+
canvas, inactiveTrackBounds, trackIconInactiveEnd, false);
26072681
}
26082682

26092683
private void calculateBoundsAndDrawTrackIcon(
26102684
@NonNull Canvas canvas,
26112685
@NonNull RectF trackBounds,
26122686
@Nullable Drawable icon,
2613-
@Nullable ColorStateList iconColor,
26142687
boolean isStart) {
26152688
if (icon != null) {
26162689
calculateTrackIconBounds(trackBounds, iconRectF, trackIconSize, isStart);
26172690
if (!iconRectF.isEmpty()) {
2618-
drawTrackIcon(canvas, iconRectF, icon, iconColor);
2691+
drawTrackIcon(canvas, iconRectF, icon);
26192692
}
26202693
}
26212694
}
26222695

26232696
private void drawTrackIcon(
26242697
@NonNull Canvas canvas,
26252698
@NonNull RectF iconBounds,
2626-
@NonNull Drawable icon,
2627-
@Nullable ColorStateList color) {
2628-
DrawableCompat.setTintList(icon, color);
2699+
@NonNull Drawable icon) {
26292700
if (isVertical()) {
26302701
rotationMatrix.mapRect(iconBounds);
26312702
}

0 commit comments

Comments
 (0)