Skip to content

Commit 373008a

Browse files
pekingmeleticiarossi
authored andcommitted
[ProgressIndicator] Added circular indeterminate animation options - advance (M3) and retreat (new).
PiperOrigin-RevId: 627941610
1 parent cf143d0 commit 373008a

12 files changed

+433
-60
lines changed

lib/java/com/google/android/material/progressindicator/BaseProgressIndicator.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,7 @@ protected BaseProgressIndicator(
164164
// ******************** Initialization **********************
165165

166166
private void registerAnimationCallbacks() {
167-
if (getProgressDrawable() != null && getIndeterminateDrawable() != null) {
168-
// Registers the animation callback to switch indeterminate mode at the end of indeterminate
169-
// animation.
170-
getIndeterminateDrawable()
171-
.getAnimatorDelegate()
172-
.registerAnimatorsCompleteCallback(switchIndeterminateModeCallback);
173-
}
167+
registerSwitchIndeterminateModeCallback();
174168

175169
// Registers the hide animation callback to determinate drawable.
176170
if (getProgressDrawable() != null) {
@@ -182,6 +176,16 @@ private void registerAnimationCallbacks() {
182176
}
183177
}
184178

179+
void registerSwitchIndeterminateModeCallback() {
180+
if (getProgressDrawable() != null && getIndeterminateDrawable() != null) {
181+
// Registers the animation callback to switch indeterminate mode at the end of indeterminate
182+
// animation.
183+
getIndeterminateDrawable()
184+
.getAnimatorDelegate()
185+
.registerAnimatorsCompleteCallback(switchIndeterminateModeCallback);
186+
}
187+
}
188+
185189
private void unregisterAnimationCallbacks() {
186190
if (getIndeterminateDrawable() != null) {
187191
getIndeterminateDrawable().unregisterAnimationCallback(hideAnimationCallback);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ void fillIndicator(
172172
@NonNull ActiveIndicator activeIndicator,
173173
@IntRange(from = 0, to = 255) int drawableAlpha) {
174174
int color = MaterialColors.compositeARGBWithAlpha(activeIndicator.color, drawableAlpha);
175+
canvas.save();
176+
canvas.rotate(activeIndicator.rotationDegree);
175177
drawArc(
176178
canvas,
177179
paint,
@@ -183,6 +185,7 @@ void fillIndicator(
183185
activeIndicator.amplitudeFraction,
184186
activeIndicator.phaseFraction,
185187
/* shouldDrawActiveIndicator= */ true);
188+
canvas.restore();
186189
}
187190

188191
@Override

lib/java/com/google/android/material/progressindicator/CircularIndeterminateAnimatorDelegate.java renamed to lib/java/com/google/android/material/progressindicator/CircularIndeterminateAdvanceAnimatorDelegate.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2020 The Android Open Source Project
2+
* Copyright (C) 2024 The Android Open Source Project
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -29,9 +29,10 @@
2929

3030
/**
3131
* This is the implementation class for drawing progress indicator in the circular indeterminate
32-
* mode.
32+
* mode with an animation that grows the active segment by modifying the end point and shrinks it by
33+
* modifying the start point.
3334
*/
34-
final class CircularIndeterminateAnimatorDelegate
35+
final class CircularIndeterminateAdvanceAnimatorDelegate
3536
extends IndeterminateAnimatorDelegate<ObjectAnimator> {
3637

3738
// Constants for animation timing.
@@ -63,7 +64,7 @@ final class CircularIndeterminateAnimatorDelegate
6364
private float completeEndFraction;
6465
AnimationCallback animatorCompleteCallback = null;
6566

66-
public CircularIndeterminateAnimatorDelegate(@NonNull CircularProgressIndicatorSpec spec) {
67+
public CircularIndeterminateAdvanceAnimatorDelegate(@NonNull CircularProgressIndicatorSpec spec) {
6768
super(/* indicatorCount= */ 1);
6869

6970
baseSpec = spec;
@@ -189,7 +190,7 @@ private void maybeUpdateSegmentColors(int playtime) {
189190
for (int cycleIndex = 0; cycleIndex < TOTAL_CYCLES; cycleIndex++) {
190191
float timeFraction =
191192
getFractionInRange(playtime, DELAY_TO_FADE_IN_MS[cycleIndex], DURATION_TO_FADE_IN_MS);
192-
if (timeFraction >= 0 && timeFraction <= 1) {
193+
if (timeFraction > 0 && timeFraction < 1) {
193194
int startColorIndex =
194195
(cycleIndex + indicatorColorIndexOffset) % baseSpec.indicatorColors.length;
195196
int endColorIndex = (startColorIndex + 1) % baseSpec.indicatorColors.length;
@@ -237,30 +238,32 @@ private void setCompleteEndFraction(float fraction) {
237238

238239
// ******************* Properties *******************
239240

240-
private static final Property<CircularIndeterminateAnimatorDelegate, Float> ANIMATION_FRACTION =
241-
new Property<CircularIndeterminateAnimatorDelegate, Float>(Float.class, "animationFraction") {
242-
@Override
243-
public Float get(CircularIndeterminateAnimatorDelegate delegate) {
244-
return delegate.getAnimationFraction();
245-
}
241+
private static final Property<CircularIndeterminateAdvanceAnimatorDelegate, Float>
242+
ANIMATION_FRACTION =
243+
new Property<CircularIndeterminateAdvanceAnimatorDelegate, Float>(
244+
Float.class, "animationFraction") {
245+
@Override
246+
public Float get(CircularIndeterminateAdvanceAnimatorDelegate delegate) {
247+
return delegate.getAnimationFraction();
248+
}
246249

247-
@Override
248-
public void set(CircularIndeterminateAnimatorDelegate delegate, Float value) {
249-
delegate.setAnimationFraction(value);
250-
}
251-
};
250+
@Override
251+
public void set(CircularIndeterminateAdvanceAnimatorDelegate delegate, Float value) {
252+
delegate.setAnimationFraction(value);
253+
}
254+
};
252255

253-
private static final Property<CircularIndeterminateAnimatorDelegate, Float>
256+
private static final Property<CircularIndeterminateAdvanceAnimatorDelegate, Float>
254257
COMPLETE_END_FRACTION =
255-
new Property<CircularIndeterminateAnimatorDelegate, Float>(
258+
new Property<CircularIndeterminateAdvanceAnimatorDelegate, Float>(
256259
Float.class, "completeEndFraction") {
257260
@Override
258-
public Float get(CircularIndeterminateAnimatorDelegate delegate) {
261+
public Float get(CircularIndeterminateAdvanceAnimatorDelegate delegate) {
259262
return delegate.getCompleteEndFraction();
260263
}
261264

262265
@Override
263-
public void set(CircularIndeterminateAnimatorDelegate delegate, Float value) {
266+
public void set(CircularIndeterminateAdvanceAnimatorDelegate delegate, Float value) {
264267
delegate.setCompleteEndFraction(value);
265268
}
266269
};

0 commit comments

Comments
 (0)