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 - + +