18
18
public class WhorlLoadingRenderer extends LoadingRenderer {
19
19
private static final Interpolator MATERIAL_INTERPOLATOR = new FastOutSlowInInterpolator ();
20
20
21
- private static final float FULL_ROTATION = 1080.0f ;
22
- private static final float ROTATION_FACTOR = 0.25f ;
23
- private static final float MAX_PROGRESS_ARC = 0.6f ;
24
-
25
- private static final float START_TRIM_DURATION_OFFSET = 0.5f ;
26
- private static final float END_TRIM_DURATION_OFFSET = 1.0f ;
27
-
28
21
private static final int DEGREE_180 = 180 ;
29
22
private static final int DEGREE_360 = 360 ;
30
23
private static final int NUM_POINTS = 5 ;
31
24
25
+ private static final float MIN_SWIPE_DEGREE = 0.1f ;
26
+ private static final float MAX_SWIPE_DEGREES = 0.6f * DEGREE_360 ;
27
+ private static final float FULL_GROUP_ROTATION = 3.0f * DEGREE_360 ;
28
+ private static final float MAX_ROTATION_INCREMENT = 0.25f * DEGREE_360 ;
29
+
30
+ private static final float START_TRIM_DURATION_OFFSET = 0.5f ;
31
+ private static final float END_TRIM_DURATION_OFFSET = 1.0f ;
32
+
32
33
private static final int [] DEFAULT_COLORS = new int []{
33
34
Color .RED , Color .GREEN , Color .BLUE
34
35
};
@@ -42,7 +43,7 @@ public void onAnimationRepeat(Animator animator) {
42
43
super .onAnimationRepeat (animator );
43
44
storeOriginals ();
44
45
45
- mStartTrim = mEndTrim ;
46
+ mStartDegrees = mEndDegrees ;
46
47
mRotationCount = (mRotationCount + 1 ) % (NUM_POINTS );
47
48
}
48
49
@@ -57,30 +58,34 @@ public void onAnimationStart(Animator animation) {
57
58
58
59
private float mStrokeInset ;
59
60
60
- private float mEndTrim ;
61
- private float mRotation ;
62
- private float mStartTrim ;
63
61
private float mRotationCount ;
64
62
private float mGroupRotation ;
65
- private float mOriginEndTrim ;
66
- private float mOriginRotation ;
67
- private float mOriginStartTrim ;
63
+
64
+ private float mEndDegrees ;
65
+ private float mStartDegrees ;
66
+ private float mSwipeDegrees ;
67
+ private float mRotationIncrement ;
68
+ private float mOriginEndDegrees ;
69
+ private float mOriginStartDegrees ;
70
+ private float mOriginRotationIncrement ;
68
71
69
72
public WhorlLoadingRenderer (Context context ) {
70
73
super (context );
74
+ init ();
71
75
setupPaint ();
72
76
addRenderListener (mAnimatorListener );
73
77
}
74
78
75
- private void setupPaint () {
79
+ private void init () {
76
80
mColors = DEFAULT_COLORS ;
81
+ setInsets ((int ) getWidth (), (int ) getHeight ());
82
+ }
77
83
84
+ private void setupPaint () {
78
85
mPaint .setAntiAlias (true );
79
86
mPaint .setStrokeWidth (getStrokeWidth ());
80
87
mPaint .setStyle (Paint .Style .STROKE );
81
88
mPaint .setStrokeCap (Paint .Cap .ROUND );
82
-
83
- setInsets ((int ) getWidth (), (int ) getHeight ());
84
89
}
85
90
86
91
@ Override
@@ -92,18 +97,11 @@ public void draw(Canvas canvas, Rect bounds) {
92
97
arcBounds .set (bounds );
93
98
arcBounds .inset (mStrokeInset , mStrokeInset );
94
99
95
- if (mStartTrim == mEndTrim ) {
96
- mStartTrim = mEndTrim + getMinProgressArc ();
97
- }
98
-
99
- float startAngle = (mStartTrim + mRotation ) * DEGREE_360 ;
100
- float endAngle = (mEndTrim + mRotation ) * DEGREE_360 ;
101
- float sweepAngle = endAngle - startAngle ;
102
-
103
100
for (int i = 0 ; i < mColors .length ; i ++) {
104
101
mPaint .setStrokeWidth (getStrokeWidth () / (i + 1 ));
105
102
mPaint .setColor (mColors [i ]);
106
- canvas .drawArc (createArcBounds (arcBounds , i ), startAngle + DEGREE_180 * (i % 2 ), sweepAngle , false , mPaint );
103
+ canvas .drawArc (createArcBounds (arcBounds , i ), mStartDegrees + DEGREE_180 * (i % 2 ),
104
+ mSwipeDegrees , false , mPaint );
107
105
}
108
106
109
107
canvas .restoreToCount (saveCount );
@@ -128,27 +126,26 @@ private RectF createArcBounds(RectF sourceArcBounds, int index) {
128
126
129
127
@ Override
130
128
public void computeRender (float renderProgress ) {
131
- final float minProgressArc = getMinProgressArc ();
132
- final float originEndTrim = mOriginEndTrim ;
133
- final float originStartTrim = mOriginStartTrim ;
134
- final float originRotation = mOriginRotation ;
135
-
136
129
// Moving the start trim only occurs in the first 50% of a
137
130
// single ring animation
138
131
if (renderProgress <= START_TRIM_DURATION_OFFSET ) {
139
132
float startTrimProgress = (renderProgress ) / (1.0f - START_TRIM_DURATION_OFFSET );
140
- mStartTrim = originStartTrim + (( MAX_PROGRESS_ARC - minProgressArc ) * MATERIAL_INTERPOLATOR .getInterpolation (startTrimProgress ) );
133
+ mStartDegrees = mOriginStartDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR .getInterpolation (startTrimProgress );
141
134
}
142
135
143
136
// Moving the end trim starts after 50% of a single ring
144
137
// animation completes
145
138
if (renderProgress > START_TRIM_DURATION_OFFSET ) {
146
139
float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET ) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET );
147
- mEndTrim = originEndTrim + (( MAX_PROGRESS_ARC - minProgressArc ) * MATERIAL_INTERPOLATOR .getInterpolation (endTrimProgress ) );
140
+ mEndDegrees = mOriginEndDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR .getInterpolation (endTrimProgress );
148
141
}
149
142
150
- mGroupRotation = ((FULL_ROTATION / NUM_POINTS ) * renderProgress ) + (FULL_ROTATION * (mRotationCount / NUM_POINTS ));
151
- mRotation = originRotation + (ROTATION_FACTOR * renderProgress );
143
+ if (Math .abs (mEndDegrees - mStartDegrees ) > MIN_SWIPE_DEGREE ) {
144
+ mSwipeDegrees = mEndDegrees - mStartDegrees ;
145
+ }
146
+
147
+ mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS ) * renderProgress ) + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS ));
148
+ mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * renderProgress );
152
149
153
150
invalidateSelf ();
154
151
}
@@ -180,33 +177,6 @@ public void setStrokeWidth(float strokeWidth) {
180
177
invalidateSelf ();
181
178
}
182
179
183
- public void setStartTrim (float startTrim ) {
184
- mStartTrim = startTrim ;
185
- invalidateSelf ();
186
- }
187
-
188
- public float getStartTrim () {
189
- return mStartTrim ;
190
- }
191
-
192
- public void setEndTrim (float endTrim ) {
193
- mEndTrim = endTrim ;
194
- invalidateSelf ();
195
- }
196
-
197
- public float getEndTrim () {
198
- return mEndTrim ;
199
- }
200
-
201
- public void setRotation (float rotation ) {
202
- mRotation = rotation ;
203
- invalidateSelf ();
204
- }
205
-
206
- public float getRotation () {
207
- return mRotation ;
208
- }
209
-
210
180
public void setInsets (int width , int height ) {
211
181
final float minEdge = (float ) Math .min (width , height );
212
182
float insets ;
@@ -219,21 +189,20 @@ public void setInsets(int width, int height) {
219
189
}
220
190
221
191
private void storeOriginals () {
222
- mOriginStartTrim = mStartTrim ;
223
- mOriginEndTrim = mEndTrim ;
224
- mOriginRotation = mRotation ;
192
+ mOriginEndDegrees = mEndDegrees ;
193
+ mOriginStartDegrees = mStartDegrees ;
194
+ mOriginRotationIncrement = mRotationIncrement ;
225
195
}
226
196
227
197
private void resetOriginals () {
228
- mOriginStartTrim = 0 ;
229
- mOriginEndTrim = 0 ;
230
- mOriginRotation = 0 ;
231
- setStartTrim ( 0 );
232
- setEndTrim ( 0 ) ;
233
- setRotation ( 0 ) ;
234
- }
198
+ mOriginEndDegrees = 0 ;
199
+ mOriginStartDegrees = 0 ;
200
+ mOriginRotationIncrement = 0 ;
201
+
202
+ mEndDegrees = 0 ;
203
+ mStartDegrees = 0 ;
204
+ mRotationIncrement = 0 ;
235
205
236
- private float getMinProgressArc () {
237
- return (float ) Math .toRadians (getStrokeWidth () / (2 * Math .PI * getCenterRadius ()));
206
+ mSwipeDegrees = MIN_SWIPE_DEGREE ;
238
207
}
239
208
}
0 commit comments