Skip to content

Commit

Permalink
[ProgressIndicator] Split stop indicator drawing from indicator drawing.
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 597537696
(cherry picked from commit f5a54d2)
  • Loading branch information
pekingme authored and hunterstich committed Mar 21, 2024
1 parent a2309ce commit 76207cb
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 24 deletions.
Expand Up @@ -25,6 +25,7 @@
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.RectF;
import androidx.annotation.ColorInt;
import androidx.annotation.FloatRange;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
Expand Down Expand Up @@ -219,6 +220,15 @@ void fillTrack(
canvas.drawArc(arcBound, 0, 360, false, paint);
}

@Override
void drawStopIndicator(
@NonNull Canvas canvas,
@NonNull Paint paint,
@ColorInt int color,
@IntRange(from = 0, to = 255) int drawableAlpha) {
// No stop indicator is used in circular type.
}

private int getSize() {
return spec.indicatorSize + spec.indicatorInset * 2;
}
Expand Down
Expand Up @@ -252,6 +252,7 @@ public void draw(@NonNull Canvas canvas) {
drawingDelegate.fillTrack(canvas, paint, getAlpha());
drawingDelegate.fillIndicator(canvas, paint, activeIndicator, getAlpha());
}
drawingDelegate.drawStopIndicator(canvas, paint, baseSpec.indicatorColors[0], getAlpha());
canvas.restore();
}

Expand Down
Expand Up @@ -89,6 +89,20 @@ abstract void fillTrack(
@NonNull Paint paint,
@IntRange(from = 0, to = 255) int drawableAlpha);

/**
* Draws the stop indicator on the track. Only implemented in linear type.
*
* @param canvas Canvas to draw.
* @param paint Paint used to draw.
* @param color The color used to draw the part without applying the alpha from drawable.
* @param drawableAlpha The alpha [0, 255] from the caller drawable.
*/
abstract void drawStopIndicator(
@NonNull Canvas canvas,
@NonNull Paint paint,
@ColorInt int color,
@IntRange(from = 0, to = 255) int drawableAlpha);

void validateSpecAndAdjustCanvas(
@NonNull Canvas canvas,
@NonNull Rect bounds,
Expand Down
Expand Up @@ -23,11 +23,13 @@
import static java.lang.Math.min;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import androidx.annotation.ColorInt;
import androidx.annotation.FloatRange;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
Expand Down Expand Up @@ -165,33 +167,9 @@ void fillIndicator(
adjustedEndX,
displayedTrackThickness / 2);
canvas.drawRoundRect(indicatorBounds, displayedCornerRadius, displayedCornerRadius, paint);

// Draw stop indicator
if (spec.trackStopIndicatorSize > 0) {
drawStopIndicator(canvas, paint, drawableAlpha);
}
canvas.restore();
}

private void drawStopIndicator(
@NonNull Canvas canvas,
@NonNull Paint paint,
@IntRange(from = 0, to = 255) int drawableAlpha) {
int indicatorColor =
MaterialColors.compositeARGBWithAlpha(spec.indicatorColors[0], drawableAlpha);
paint.setColor(indicatorColor);
Rect trackBounds = canvas.getClipBounds();
// Maintain proper ratio when stop is smaller than track height and offset from edges.
float offset = max(0, displayedTrackThickness - spec.trackStopIndicatorSize);
RectF stopBounds =
new RectF(
trackBounds.right - displayedTrackThickness + offset / 2,
-(displayedTrackThickness - offset) / 2,
trackBounds.right - offset / 2,
(displayedTrackThickness - offset) / 2);
canvas.drawRoundRect(stopBounds, displayedCornerRadius, displayedCornerRadius, paint);
}

@Override
void fillTrack(
@NonNull Canvas canvas,
Expand All @@ -215,4 +193,32 @@ void fillTrack(
Path.Direction.CCW);
canvas.drawPath(displayedTrackPath, paint);
}

@Override
void drawStopIndicator(
@NonNull Canvas canvas,
@NonNull Paint paint,
@ColorInt int color,
@IntRange(from = 0, to = 255) int drawableAlpha) {
int paintColor = MaterialColors.compositeARGBWithAlpha(color, drawableAlpha);
if (spec.trackStopIndicatorSize > 0 && paintColor != Color.TRANSPARENT) {
// Draws the stop indicator at the end of the track if needed.
paint.setStyle(Style.FILL);
paint.setAntiAlias(true);
paint.setColor(paintColor);
canvas.save();
// Avoid the indicator being drawn out of the track.
canvas.clipPath(displayedTrackPath);
Rect trackBounds = canvas.getClipBounds();
float offset = max(0, displayedTrackThickness - spec.trackStopIndicatorSize);
RectF stopBounds =
new RectF(
trackBounds.right - displayedTrackThickness + offset / 2,
-(displayedTrackThickness - offset) / 2,
trackBounds.right - offset / 2,
(displayedTrackThickness - offset) / 2);
canvas.drawRoundRect(stopBounds, displayedCornerRadius, displayedCornerRadius, paint);
canvas.restore();
}
}
}

0 comments on commit 76207cb

Please sign in to comment.