|
117
|
+ canvas.rotate(mGroupRotation, mTempBounds.centerX(), mTempBounds.centerY());
|
|
118
|
+
|
|
119
|
+ mPaint.setColor(mColor);
|
|
120
|
+ mPaint.setAlpha((int) (MAX_ALPHA * mScale));
|
|
121
|
+ mPaint.setStrokeWidth(mStrokeWidth * mScale);
|
|
122
|
+
|
|
123
|
+ if (mSwipeDegrees != 0) {
|
|
124
|
+ for (int i = 0; i < mGearCount; i++) {
|
|
125
|
+ canvas.drawArc(mTempBounds, mStartDegrees + DEGREE_360 / mGearCount * i, mSwipeDegrees, false, mPaint);
|
|
126
|
+ }
|
|
127
|
+ }
|
|
128
|
+
|
|
129
|
+ canvas.restoreToCount(saveCount);
|
|
130
|
+ }
|
|
131
|
+
|
|
132
|
+ @Override
|
|
133
|
+ protected void computeRender(float renderProgress) {
|
|
134
|
+ // Scaling up the start size only occurs in the first 20% of a single ring animation
|
|
135
|
+ if (renderProgress <= START_SCALE_DURATION_OFFSET) {
|
|
136
|
+ float startScaleProgress = (renderProgress) / START_SCALE_DURATION_OFFSET;
|
|
137
|
+ mScale = DECELERATE_INTERPOLATOR.getInterpolation(startScaleProgress);
|
|
138
|
+ }
|
|
139
|
+
|
|
140
|
+ // Moving the start trim only occurs between 20% to 50% of a single ring animation
|
|
141
|
+ if (renderProgress <= START_TRIM_DURATION_OFFSET && renderProgress > START_SCALE_DURATION_OFFSET) {
|
|
142
|
+ float startTrimProgress = (renderProgress - START_SCALE_DURATION_OFFSET) / (START_TRIM_DURATION_OFFSET - START_SCALE_DURATION_OFFSET);
|
|
143
|
+ mStartDegrees = mOriginStartDegrees + mGearSwipeDegrees * startTrimProgress;
|
|
144
|
+ }
|
|
145
|
+
|
|
146
|
+ // Moving the end trim starts between 50% to 80% of a single ring animation
|
|
147
|
+ if (renderProgress <= END_TRIM_DURATION_OFFSET && renderProgress > START_TRIM_DURATION_OFFSET) {
|
|
148
|
+ float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET);
|
|
149
|
+ mEndDegrees = mOriginEndDegrees + mGearSwipeDegrees * endTrimProgress;
|
|
150
|
+ }
|
|
151
|
+
|
|
152
|
+ // Scaling down the end size starts after 80% of a single ring animation
|
|
153
|
+ if (renderProgress > END_TRIM_DURATION_OFFSET) {
|
|
154
|
+ float endScaleProgress = (renderProgress - END_TRIM_DURATION_OFFSET) / (END_SCALE_DURATION_OFFSET - END_TRIM_DURATION_OFFSET);
|
|
155
|
+ mScale = 1.0f - ACCELERATE_INTERPOLATOR.getInterpolation(endScaleProgress);
|
|
156
|
+ }
|
|
157
|
+
|
|
158
|
+ if (renderProgress <= END_TRIM_DURATION_OFFSET && renderProgress > START_SCALE_DURATION_OFFSET) {
|
|
159
|
+ float rotateProgress = (renderProgress - START_SCALE_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_SCALE_DURATION_OFFSET);
|
|
160
|
+ mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * rotateProgress) + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS));
|
|
161
|
+ }
|
|
162
|
+
|
|
163
|
+ if (Math.abs(mEndDegrees - mStartDegrees) > 0) {
|
|
164
|
+ mSwipeDegrees = mEndDegrees - mStartDegrees;
|
|
165
|
+ }
|
|
166
|
+ }
|
|
167
|
+
|
|
168
|
+ @Override
|
|
169
|
+ protected void setAlpha(int alpha) {
|
|
170
|
+ mPaint.setAlpha(alpha);
|
|
171
|
+ }
|
|
172
|
+
|
|
173
|
+ @Override
|
|
174
|
+ protected void setColorFilter(ColorFilter cf) {
|
|
175
|
+ mPaint.setColorFilter(cf);
|
|
176
|
+ }
|
|
177
|
+
|
|
178
|
+ @Override
|
|
179
|
+ protected void reset() {
|
|
180
|
+ resetOriginals();
|
|
181
|
+ }
|
|
182
|
+
|
|
183
|
+ private void initStrokeInset(float width, float height) {
|
|
184
|
+ float minSize = Math.min(width, height);
|
|
185
|
+ float strokeInset = minSize / 2.0f - mCenterRadius;
|
|
186
|
+ float minStrokeInset = (float) Math.ceil(mStrokeWidth / 2.0f);
|
|
187
|
+ mStrokeInset = strokeInset < minStrokeInset ? minStrokeInset : strokeInset;
|
|
188
|
+ }
|
|
189
|
+
|
|
190
|
+ private void storeOriginals() {
|
|
191
|
+ mOriginEndDegrees = mEndDegrees;
|
|
192
|
+ mOriginStartDegrees = mEndDegrees;
|
|
193
|
+ }
|
|
194
|
+
|
|
195
|
+ private void resetOriginals() {
|
|
196
|
+ mOriginEndDegrees = 0;
|
|
197
|
+ mOriginStartDegrees = 0;
|
|
198
|
+
|
|
199
|
+ mEndDegrees = 0;
|
|
200
|
+ mStartDegrees = 0;
|
|
201
|
+
|
|
202
|
+ mSwipeDegrees = 1;
|
|
203
|
+ }
|
|
204
|
+
|
|
205
|
+ private void apply(Builder builder) {
|
|
206
|
+ this.mWidth = builder.mWidth > 0 ? builder.mWidth : this.mWidth;
|
|
207
|
+ this.mHeight = builder.mHeight > 0 ? builder.mHeight : this.mHeight;
|
|
208
|
+ this.mStrokeWidth = builder.mStrokeWidth > 0 ? builder.mStrokeWidth : this.mStrokeWidth;
|
|
209
|
+ this.mCenterRadius = builder.mCenterRadius > 0 ? builder.mCenterRadius : this.mCenterRadius;
|
|
210
|
+
|
|
211
|
+ this.mDuration = builder.mDuration > 0 ? builder.mDuration : this.mDuration;
|
|
212
|
+
|
|
213
|
+ this.mColor = builder.mColor != 0 ? builder.mColor : this.mColor;
|
|
214
|
+
|
|
215
|
+ this.mGearCount = builder.mGearCount > 0 ? builder.mGearCount : this.mGearCount;
|
|
216
|
+ this.mGearSwipeDegrees = builder.mGearSwipeDegrees > 0 ? builder.mGearSwipeDegrees : this.mGearSwipeDegrees;
|
|
217
|
+
|
|
218
|
+ setupPaint();
|
|
219
|
+ initStrokeInset(this.mWidth, this.mHeight);
|
|
220
|
+ }
|
|
221
|
+
|
|
222
|
+ public static class Builder {
|
|
223
|
+ private Context mContext;
|
|
224
|
+
|
|
225
|
+ private int mWidth;
|
|
226
|
+ private int mHeight;
|
|
227
|
+ private int mStrokeWidth;
|
|
228
|
+ private int mCenterRadius;
|
|
229
|
+
|
|
230
|
+ private int mDuration;
|
|
231
|
+
|
|
232
|
+ private int mColor;
|
|
233
|
+
|
|
234
|
+ private int mGearCount;
|
|
235
|
+ private int mGearSwipeDegrees;
|
|
236
|
+
|
|
237
|
+ public Builder(Context mContext) {
|
|
238
|
+ this.mContext = mContext;
|
|
239
|
+ }
|
|
240
|
+
|
|
241
|
+ public Builder setWidth(int width) {
|
|
242
|
+ this.mWidth = width;
|
|
243
|
+ return this;
|
|
244
|
+ }
|
|
245
|
+
|
|
246
|
+ public Builder setHeight(int height) {
|
|
247
|
+ this.mHeight = height;
|
|
248
|
+ return this;
|
|
249
|
+ }
|
|
250
|
+
|
|
251
|
+ public Builder setStrokeWidth(int strokeWidth) {
|
|
252
|
+ this.mStrokeWidth = strokeWidth;
|
|
253
|
+ return this;
|
|
254
|
+ }
|
|
255
|
+
|
|
256
|
+ public Builder setCenterRadius(int centerRadius) {
|
|
257
|
+ this.mCenterRadius = centerRadius;
|
|
258
|
+ return this;
|
|
259
|
+ }
|
|
260
|
+
|
|
261
|
+ public Builder setDuration(int duration) {
|
|
262
|
+ this.mDuration = duration;
|
|
263
|
+ return this;
|
|
264
|
+ }
|
|
265
|
+
|
|
266
|
+ public Builder setColor(int color) {
|
|
267
|
+ this.mColor = color;
|
|
268
|
+ return this;
|
|
269
|
+ }
|
|
270
|
+
|
|
271
|
+ public Builder setGearCount(int gearCount) {
|
|
272
|
+ this.mGearCount = gearCount;
|
|
273
|
+ return this;
|
|
274
|
+ }
|
|
275
|
+
|
|
276
|
+ public Builder setGearSwipeDegrees(@IntRange(from = 0, to = 360) int gearSwipeDegrees) {
|
|
277
|
+ this.mGearSwipeDegrees = gearSwipeDegrees;
|
|
278
|
+ return this;
|
|
279
|
+ }
|
|
280
|
+
|
|
281
|
+ public GearLoadingRenderer build() {
|
|
282
|
+ GearLoadingRenderer loadingRenderer = new GearLoadingRenderer(mContext);
|
|
283
|
+ loadingRenderer.apply(this);
|
|
284
|
+ return loadingRenderer;
|
|
285
|
+ }
|
|
286
|
+ }
|
|
287
|
+}
|
|
|
@@ -121,4 +121,31 @@
|
121
|
121
|
<attr name="hasStickyHeaders" format="boolean" />
|
122
|
122
|
<attr name="isDrawingListUnderStickyHeader" format="boolean" />
|
123
|
123
|
</declare-styleable>
|
|
124
|
+
|
|
125
|
+ <declare-styleable name="LoadingView">
|
|
126
|
+ <attr name="loading_renderer">
|
|
127
|
+ <!--circle rotate-->
|
|
128
|
+ <enum name="MaterialLoadingRenderer" value="0"/>
|
|
129
|
+ <enum name="LevelLoadingRenderer" value="1"/>
|
|
130
|
+ <enum name="WhorlLoadingRenderer" value="2"/>
|
|
131
|
+ <enum name="GearLoadingRenderer" value="3"/>
|
|
132
|
+ <!--circle jump-->
|
|
133
|
+ <enum name="SwapLoadingRenderer" value="4"/>
|
|
134
|
+ <enum name="GuardLoadingRenderer" value="5"/>
|
|
135
|
+ <enum name="DanceLoadingRenderer" value="6"/>
|
|
136
|
+ <enum name="CollisionLoadingRenderer" value="7"/>
|
|
137
|
+ <!--Scenery-->
|
|
138
|
+ <enum name="DayNightLoadingRenderer" value="8"/>
|
|
139
|
+ <enum name="ElectricFanLoadingRenderer" value="9"/>
|
|
140
|
+ <!--Animal-->
|
|
141
|
+ <enum name="FishLoadingRenderer" value="10"/>
|
|
142
|
+ <enum name="GhostsEyeLoadingRenderer" value="11"/>
|
|
143
|
+ <!--Goods-->
|
|
144
|
+ <enum name="BalloonLoadingRenderer" value="12"/>
|
|
145
|
+ <enum name="WaterBottleLoadingRenderer" value="13"/>
|
|
146
|
+ <!--ShapeChange-->
|
|
147
|
+ <enum name="CircleBroodLoadingRenderer" value="14"/>
|
|
148
|
+ <enum name="CoolWaitLoadingRenderer" value="15"/>
|
|
149
|
+ </attr>
|
|
150
|
+ </declare-styleable>
|
124
|
151
|
</resources>
|