From cb5afbc1d6553866f8299c30675d3fd9b8c43bc7 Mon Sep 17 00:00:00 2001
From: pekingme <8545955+pekingme@users.noreply.github.com>
Date: Wed, 1 May 2024 20:54:43 +0000
Subject: [PATCH] [ProgressIndicator] Updated to draw the track in Circular
indeterminate mode with an option to opt out this behavior.
PiperOrigin-RevId: 629828525
---
.../CircularProgressIndicatorSpec.java | 5 ++
.../IndeterminateDrawable.java | 24 +++++--
.../progressindicator/res/values/attrs.xml | 72 ++++++++++---------
.../progressindicator/res/values/styles.xml | 17 ++++-
4 files changed, 76 insertions(+), 42 deletions(-)
diff --git a/lib/java/com/google/android/material/progressindicator/CircularProgressIndicatorSpec.java b/lib/java/com/google/android/material/progressindicator/CircularProgressIndicatorSpec.java
index d61025970ff..03b6d37e77c 100644
--- a/lib/java/com/google/android/material/progressindicator/CircularProgressIndicatorSpec.java
+++ b/lib/java/com/google/android/material/progressindicator/CircularProgressIndicatorSpec.java
@@ -51,6 +51,9 @@ public final class CircularProgressIndicatorSpec extends BaseProgressIndicatorSp
/** The direction in which the indicator will rotate and grow to. */
@IndicatorDirection public int indicatorDirection;
+ /** Whether to show the track in the indeterminate mode. */
+ public boolean indeterminateTrackVisible;
+
/**
* Instantiates the spec for {@link CircularProgressIndicator}.
*
@@ -107,6 +110,8 @@ public CircularProgressIndicatorSpec(
a.getInt(
R.styleable.CircularProgressIndicator_indicatorDirectionCircular,
CircularProgressIndicator.INDICATOR_DIRECTION_CLOCKWISE);
+ indeterminateTrackVisible =
+ a.getBoolean(R.styleable.CircularProgressIndicator_indeterminateTrackVisible, true);
a.recycle();
validateSpec();
diff --git a/lib/java/com/google/android/material/progressindicator/IndeterminateDrawable.java b/lib/java/com/google/android/material/progressindicator/IndeterminateDrawable.java
index c0ec892346b..7b92c24a8a9 100644
--- a/lib/java/com/google/android/material/progressindicator/IndeterminateDrawable.java
+++ b/lib/java/com/google/android/material/progressindicator/IndeterminateDrawable.java
@@ -203,7 +203,11 @@ public void draw(@NonNull Canvas canvas) {
int gapSize = baseSpec.indicatorTrackGapSize;
int trackAlpha = getAlpha();
- boolean drawFullTrack = gapSize == 0 && !baseSpec.hasWavyEffect();
+ boolean drawTrack =
+ baseSpec instanceof LinearProgressIndicatorSpec
+ || (baseSpec instanceof CircularProgressIndicatorSpec
+ && ((CircularProgressIndicatorSpec) baseSpec).indeterminateTrackVisible);
+ boolean drawFullTrack = drawTrack && gapSize == 0 && !baseSpec.hasWavyEffect();
if (drawFullTrack) {
drawingDelegate.fillTrack(
@@ -214,7 +218,8 @@ public void draw(@NonNull Canvas canvas) {
baseSpec.trackColor,
trackAlpha,
/* gapSize= */ 0);
- } else {
+ } else if (drawTrack) {
+ // Draws the track with partial length.
ActiveIndicator firstIndicator = animatorDelegate.activeIndicators.get(0);
ActiveIndicator lastIndicator =
animatorDelegate.activeIndicators.get(animatorDelegate.activeIndicators.size() - 1);
@@ -235,8 +240,19 @@ public void draw(@NonNull Canvas canvas) {
baseSpec.trackColor,
trackAlpha,
gapSize);
+ } else {
+ canvas.save();
+ canvas.rotate(lastIndicator.rotationDegree);
+ drawingDelegate.fillTrack(
+ canvas,
+ paint,
+ lastIndicator.endFraction,
+ firstIndicator.startFraction + 1f,
+ baseSpec.trackColor,
+ trackAlpha,
+ gapSize);
+ canvas.restore();
}
- // No inactive track is drawn in circular indeterminate mode.
}
// Draws indicators and tracks in between.
@@ -249,7 +265,7 @@ public void draw(@NonNull Canvas canvas) {
drawingDelegate.fillIndicator(canvas, paint, curIndicator, getAlpha());
// Draws tracks between indicators.
- if (indicatorIndex > 0 && !drawFullTrack) {
+ if (indicatorIndex > 0 && !drawFullTrack && drawTrack) {
ActiveIndicator prevIndicator = animatorDelegate.activeIndicators.get(indicatorIndex - 1);
drawingDelegate.fillTrack(
canvas,
diff --git a/lib/java/com/google/android/material/progressindicator/res/values/attrs.xml b/lib/java/com/google/android/material/progressindicator/res/values/attrs.xml
index 0efc37380d7..9dfc9d53527 100644
--- a/lib/java/com/google/android/material/progressindicator/res/values/attrs.xml
+++ b/lib/java/com/google/android/material/progressindicator/res/values/attrs.xml
@@ -18,90 +18,90 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -112,11 +112,11 @@
This type is only available when there are three or more indicator
colors.
-->
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
-
-
-
-
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/lib/java/com/google/android/material/progressindicator/res/values/styles.xml b/lib/java/com/google/android/material/progressindicator/res/values/styles.xml
index b5b5c423e31..0e6091f2635 100644
--- a/lib/java/com/google/android/material/progressindicator/res/values/styles.xml
+++ b/lib/java/com/google/android/material/progressindicator/res/values/styles.xml
@@ -34,6 +34,7 @@
- @dimen/mtrl_progress_circular_inset_medium
- @android:color/transparent
- clockwise
+ - true
-
-
-
+
+
+