Skip to content

Commit 76207cb

Browse files
pekingmehunterstich
authored andcommittedMar 21, 2024
[ProgressIndicator] Split stop indicator drawing from indicator drawing.
PiperOrigin-RevId: 597537696 (cherry picked from commit f5a54d2)
1 parent a2309ce commit 76207cb

File tree

4 files changed

+55
-24
lines changed

4 files changed

+55
-24
lines changed
 

‎lib/java/com/google/android/material/progressindicator/CircularDrawingDelegate.java

+10
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import android.graphics.Paint.Style;
2626
import android.graphics.Rect;
2727
import android.graphics.RectF;
28+
import androidx.annotation.ColorInt;
2829
import androidx.annotation.FloatRange;
2930
import androidx.annotation.IntRange;
3031
import androidx.annotation.NonNull;
@@ -219,6 +220,15 @@ void fillTrack(
219220
canvas.drawArc(arcBound, 0, 360, false, paint);
220221
}
221222

223+
@Override
224+
void drawStopIndicator(
225+
@NonNull Canvas canvas,
226+
@NonNull Paint paint,
227+
@ColorInt int color,
228+
@IntRange(from = 0, to = 255) int drawableAlpha) {
229+
// No stop indicator is used in circular type.
230+
}
231+
222232
private int getSize() {
223233
return spec.indicatorSize + spec.indicatorInset * 2;
224234
}

‎lib/java/com/google/android/material/progressindicator/DeterminateDrawable.java

+1
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ public void draw(@NonNull Canvas canvas) {
252252
drawingDelegate.fillTrack(canvas, paint, getAlpha());
253253
drawingDelegate.fillIndicator(canvas, paint, activeIndicator, getAlpha());
254254
}
255+
drawingDelegate.drawStopIndicator(canvas, paint, baseSpec.indicatorColors[0], getAlpha());
255256
canvas.restore();
256257
}
257258

‎lib/java/com/google/android/material/progressindicator/DrawingDelegate.java

+14
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,20 @@ abstract void fillTrack(
8989
@NonNull Paint paint,
9090
@IntRange(from = 0, to = 255) int drawableAlpha);
9191

92+
/**
93+
* Draws the stop indicator on the track. Only implemented in linear type.
94+
*
95+
* @param canvas Canvas to draw.
96+
* @param paint Paint used to draw.
97+
* @param color The color used to draw the part without applying the alpha from drawable.
98+
* @param drawableAlpha The alpha [0, 255] from the caller drawable.
99+
*/
100+
abstract void drawStopIndicator(
101+
@NonNull Canvas canvas,
102+
@NonNull Paint paint,
103+
@ColorInt int color,
104+
@IntRange(from = 0, to = 255) int drawableAlpha);
105+
92106
void validateSpecAndAdjustCanvas(
93107
@NonNull Canvas canvas,
94108
@NonNull Rect bounds,

‎lib/java/com/google/android/material/progressindicator/LinearDrawingDelegate.java

+30-24
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@
2323
import static java.lang.Math.min;
2424

2525
import android.graphics.Canvas;
26+
import android.graphics.Color;
2627
import android.graphics.Paint;
2728
import android.graphics.Paint.Style;
2829
import android.graphics.Path;
2930
import android.graphics.Rect;
3031
import android.graphics.RectF;
32+
import androidx.annotation.ColorInt;
3133
import androidx.annotation.FloatRange;
3234
import androidx.annotation.IntRange;
3335
import androidx.annotation.NonNull;
@@ -165,33 +167,9 @@ void fillIndicator(
165167
adjustedEndX,
166168
displayedTrackThickness / 2);
167169
canvas.drawRoundRect(indicatorBounds, displayedCornerRadius, displayedCornerRadius, paint);
168-
169-
// Draw stop indicator
170-
if (spec.trackStopIndicatorSize > 0) {
171-
drawStopIndicator(canvas, paint, drawableAlpha);
172-
}
173170
canvas.restore();
174171
}
175172

176-
private void drawStopIndicator(
177-
@NonNull Canvas canvas,
178-
@NonNull Paint paint,
179-
@IntRange(from = 0, to = 255) int drawableAlpha) {
180-
int indicatorColor =
181-
MaterialColors.compositeARGBWithAlpha(spec.indicatorColors[0], drawableAlpha);
182-
paint.setColor(indicatorColor);
183-
Rect trackBounds = canvas.getClipBounds();
184-
// Maintain proper ratio when stop is smaller than track height and offset from edges.
185-
float offset = max(0, displayedTrackThickness - spec.trackStopIndicatorSize);
186-
RectF stopBounds =
187-
new RectF(
188-
trackBounds.right - displayedTrackThickness + offset / 2,
189-
-(displayedTrackThickness - offset) / 2,
190-
trackBounds.right - offset / 2,
191-
(displayedTrackThickness - offset) / 2);
192-
canvas.drawRoundRect(stopBounds, displayedCornerRadius, displayedCornerRadius, paint);
193-
}
194-
195173
@Override
196174
void fillTrack(
197175
@NonNull Canvas canvas,
@@ -215,4 +193,32 @@ void fillTrack(
215193
Path.Direction.CCW);
216194
canvas.drawPath(displayedTrackPath, paint);
217195
}
196+
197+
@Override
198+
void drawStopIndicator(
199+
@NonNull Canvas canvas,
200+
@NonNull Paint paint,
201+
@ColorInt int color,
202+
@IntRange(from = 0, to = 255) int drawableAlpha) {
203+
int paintColor = MaterialColors.compositeARGBWithAlpha(color, drawableAlpha);
204+
if (spec.trackStopIndicatorSize > 0 && paintColor != Color.TRANSPARENT) {
205+
// Draws the stop indicator at the end of the track if needed.
206+
paint.setStyle(Style.FILL);
207+
paint.setAntiAlias(true);
208+
paint.setColor(paintColor);
209+
canvas.save();
210+
// Avoid the indicator being drawn out of the track.
211+
canvas.clipPath(displayedTrackPath);
212+
Rect trackBounds = canvas.getClipBounds();
213+
float offset = max(0, displayedTrackThickness - spec.trackStopIndicatorSize);
214+
RectF stopBounds =
215+
new RectF(
216+
trackBounds.right - displayedTrackThickness + offset / 2,
217+
-(displayedTrackThickness - offset) / 2,
218+
trackBounds.right - offset / 2,
219+
(displayedTrackThickness - offset) / 2);
220+
canvas.drawRoundRect(stopBounds, displayedCornerRadius, displayedCornerRadius, paint);
221+
canvas.restore();
222+
}
223+
}
218224
}

0 commit comments

Comments
 (0)
Please sign in to comment.