Skip to content

Commit ddda777

Browse files
pubiqqleticiarossi
authored andcommitted
[Slider] Always update track bounds before drawing icons
Resolves #4488 GIT_ORIGIN_REV_ID=0437dc5fd010715429822287ec12a8f77bffbe92 PiperOrigin-RevId: 712658525
1 parent ddbfe29 commit ddda777

File tree

1 file changed

+50
-25
lines changed

1 file changed

+50
-25
lines changed

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

+50-25
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,8 @@ abstract class BaseSlider<
368368

369369
@NonNull private final Path trackPath = new Path();
370370
@NonNull private final RectF activeTrackRect = new RectF();
371-
@NonNull private final RectF inactiveTrackRect = new RectF();
371+
@NonNull private final RectF inactiveTrackLeftRect = new RectF();
372+
@NonNull private final RectF inactiveTrackRightRect = new RectF();
372373
@NonNull private final RectF cornerRect = new RectF();
373374
@NonNull private final Rect labelRect = new Rect();
374375
@NonNull private final RectF iconRectF = new RectF();
@@ -2410,15 +2411,14 @@ protected void onDraw(@NonNull Canvas canvas) {
24102411

24112412
int yCenter = calculateTrackCenter();
24122413

2413-
float first = values.get(0);
2414-
float last = values.get(values.size() - 1);
2415-
if (last < valueTo || (values.size() > 1 && first > valueFrom)) {
2416-
drawInactiveTrack(canvas, trackWidth, yCenter);
2417-
}
2418-
if (last > valueFrom) {
2419-
drawActiveTrack(canvas, trackWidth, yCenter);
2414+
drawInactiveTracks(canvas, trackWidth, yCenter);
2415+
drawActiveTracks(canvas, trackWidth, yCenter);
2416+
2417+
if (isRtl() || isVertical()) {
2418+
drawTrackIcons(canvas, activeTrackRect, inactiveTrackLeftRect);
2419+
} else {
2420+
drawTrackIcons(canvas, activeTrackRect, inactiveTrackRightRect);
24202421
}
2421-
drawTrackIcons(canvas, activeTrackRect, inactiveTrackRect);
24222422

24232423
maybeDrawTicks(canvas);
24242424
maybeDrawStopIndicator(canvas, yCenter);
@@ -2446,34 +2446,50 @@ private float[] getActiveRange() {
24462446
return isRtl() || isVertical() ? new float[] {right, left} : new float[] {left, right};
24472447
}
24482448

2449-
private void drawInactiveTrack(@NonNull Canvas canvas, int width, int yCenter) {
2450-
int trackCornerSize = getTrackCornerSize();
2449+
private void drawInactiveTracks(@NonNull Canvas canvas, int width, int yCenter) {
2450+
populateInactiveTrackRightRect(width, yCenter);
2451+
updateTrack(
2452+
canvas,
2453+
inactiveTrackPaint,
2454+
inactiveTrackRightRect,
2455+
getTrackCornerSize(),
2456+
FullCornerDirection.RIGHT);
2457+
2458+
// Also draw inactive track to the left if there is any
2459+
populateInactiveTrackLeftRect(width, yCenter);
2460+
updateTrack(
2461+
canvas,
2462+
inactiveTrackPaint,
2463+
inactiveTrackLeftRect,
2464+
getTrackCornerSize(),
2465+
FullCornerDirection.LEFT);
2466+
}
2467+
2468+
private void populateInactiveTrackRightRect(int width, int yCenter) {
24512469
float[] activeRange = getActiveRange();
24522470
float right = trackSidePadding + activeRange[1] * width;
24532471
if (right < trackSidePadding + width) {
2454-
inactiveTrackRect.set(
2472+
inactiveTrackRightRect.set(
24552473
right + thumbTrackGapSize,
24562474
yCenter - trackThickness / 2f,
2457-
trackSidePadding + width + trackCornerSize,
2475+
trackSidePadding + width + getTrackCornerSize(),
24582476
yCenter + trackThickness / 2f);
2459-
updateTrack(
2460-
canvas,
2461-
inactiveTrackPaint,
2462-
inactiveTrackRect,
2463-
trackCornerSize,
2464-
FullCornerDirection.RIGHT);
2477+
} else {
2478+
inactiveTrackRightRect.setEmpty();
24652479
}
2480+
}
24662481

2467-
// Also draw inactive track to the left if there is any
2482+
private void populateInactiveTrackLeftRect(int width, int yCenter) {
2483+
float[] activeRange = getActiveRange();
24682484
float left = trackSidePadding + activeRange[0] * width;
24692485
if (left > trackSidePadding) {
2470-
inactiveTrackRect.set(
2471-
trackSidePadding - trackCornerSize,
2486+
inactiveTrackLeftRect.set(
2487+
trackSidePadding - getTrackCornerSize(),
24722488
yCenter - trackThickness / 2f,
24732489
left - thumbTrackGapSize,
24742490
yCenter + trackThickness / 2f);
2475-
updateTrack(
2476-
canvas, inactiveTrackPaint, inactiveTrackRect, trackCornerSize, FullCornerDirection.LEFT);
2491+
} else {
2492+
inactiveTrackLeftRect.setEmpty();
24772493
}
24782494
}
24792495

@@ -2489,10 +2505,14 @@ private float normalizeValue(float value) {
24892505
return normalized;
24902506
}
24912507

2492-
private void drawActiveTrack(@NonNull Canvas canvas, int width, int yCenter) {
2508+
private void drawActiveTracks(@NonNull Canvas canvas, int width, int yCenter) {
24932509
float[] activeRange = getActiveRange();
24942510
float right = trackSidePadding + activeRange[1] * width;
24952511
float left = trackSidePadding + activeRange[0] * width;
2512+
if (left >= right) {
2513+
activeTrackRect.setEmpty();
2514+
return;
2515+
}
24962516

24972517
FullCornerDirection direction = FullCornerDirection.NONE;
24982518
if (values.size() == 1) { // Only 1 thumb
@@ -2532,6 +2552,7 @@ private void drawActiveTrack(@NonNull Canvas canvas, int width, int yCenter) {
25322552

25332553
// Nothing to draw if left is bigger than right.
25342554
if (left >= right) {
2555+
activeTrackRect.setEmpty();
25352556
continue;
25362557
}
25372558

@@ -2652,6 +2673,10 @@ private enum FullCornerDirection {
26522673

26532674
private void updateTrack(
26542675
Canvas canvas, Paint paint, RectF bounds, float cornerSize, FullCornerDirection direction) {
2676+
if (bounds.isEmpty()) {
2677+
return;
2678+
}
2679+
26552680
float leftCornerSize = calculateStartTrackCornerSize(cornerSize);
26562681
float rightCornerSize = calculateEndTrackCornerSize(cornerSize);
26572682
switch (direction) {

0 commit comments

Comments
 (0)