="lines-code">
+ canvas.rotate(mGroupRotation, mTempBounds.centerX(), mTempBounds.centerY());
+
+ mPaint.setColor(mColor);
+ mPaint.setAlpha((int) (MAX_ALPHA * mScale));
+ mPaint.setStrokeWidth(mStrokeWidth * mScale);
+
+ if (mSwipeDegrees != 0) {
+ for (int i = 0; i < mGearCount; i++) {
+ canvas.drawArc(mTempBounds, mStartDegrees + DEGREE_360 / mGearCount * i, mSwipeDegrees, false, mPaint);
+ }
+ }
+
+ canvas.restoreToCount(saveCount);
+ }
+
+ @Override
+ protected void computeRender(float renderProgress) {
+ // Scaling up the start size only occurs in the first 20% of a single ring animation
+ if (renderProgress <= START_SCALE_DURATION_OFFSET) {
+ float startScaleProgress = (renderProgress) / START_SCALE_DURATION_OFFSET;
+ mScale = DECELERATE_INTERPOLATOR.getInterpolation(startScaleProgress);
+ }
+
+ // Moving the start trim only occurs between 20% to 50% of a single ring animation
+ if (renderProgress <= START_TRIM_DURATION_OFFSET && renderProgress > START_SCALE_DURATION_OFFSET) {
+ float startTrimProgress = (renderProgress - START_SCALE_DURATION_OFFSET) / (START_TRIM_DURATION_OFFSET - START_SCALE_DURATION_OFFSET);
+ mStartDegrees = mOriginStartDegrees + mGearSwipeDegrees * startTrimProgress;
+ }
+
+ // Moving the end trim starts between 50% to 80% of a single ring animation
+ if (renderProgress <= END_TRIM_DURATION_OFFSET && renderProgress > START_TRIM_DURATION_OFFSET) {
+ float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET);
+ mEndDegrees = mOriginEndDegrees + mGearSwipeDegrees * endTrimProgress;
+ }
+
+ // Scaling down the end size starts after 80% of a single ring animation
+ if (renderProgress > END_TRIM_DURATION_OFFSET) {
+ float endScaleProgress = (renderProgress - END_TRIM_DURATION_OFFSET) / (END_SCALE_DURATION_OFFSET - END_TRIM_DURATION_OFFSET);
+ mScale = 1.0f - ACCELERATE_INTERPOLATOR.getInterpolation(endScaleProgress);
+ }
+
+ if (renderProgress <= END_TRIM_DURATION_OFFSET && renderProgress > START_SCALE_DURATION_OFFSET) {
+ float rotateProgress = (renderProgress - START_SCALE_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_SCALE_DURATION_OFFSET);
+ mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * rotateProgress) + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS));
+ }
+
+ if (Math.abs(mEndDegrees - mStartDegrees) > 0) {
+ mSwipeDegrees = mEndDegrees - mStartDegrees;
+ }
+ }
+
+ @Override
+ protected void setAlpha(int alpha) {
+ mPaint.setAlpha(alpha);
+ }
+
+ @Override
+ protected void setColorFilter(ColorFilter cf) {
+ mPaint.setColorFilter(cf);
+ }
+
+ @Override
+ protected void reset() {
+ resetOriginals();
+ }
+
+ private void initStrokeInset(float width, float height) {
+ float minSize = Math.min(width, height);
+ float strokeInset = minSize / 2.0f - mCenterRadius;
+ float minStrokeInset = (float) Math.ceil(mStrokeWidth / 2.0f);
+ mStrokeInset = strokeInset < minStrokeInset ? minStrokeInset : strokeInset;
+ }
+
+ private void storeOriginals() {
+ mOriginEndDegrees = mEndDegrees;
+ mOriginStartDegrees = mEndDegrees;
+ }
+
+ private void resetOriginals() {
+ mOriginEndDegrees = 0;
+ mOriginStartDegrees = 0;
+
+ mEndDegrees = 0;
+ mStartDegrees = 0;
+
+ mSwipeDegrees = 1;
+ }
+
+ private void apply(Builder builder) {
+ this.mWidth = builder.mWidth > 0 ? builder.mWidth : this.mWidth;
+ this.mHeight = builder.mHeight > 0 ? builder.mHeight : this.mHeight;
+ this.mStrokeWidth = builder.mStrokeWidth > 0 ? builder.mStrokeWidth : this.mStrokeWidth;
+ this.mCenterRadius = builder.mCenterRadius > 0 ? builder.mCenterRadius : this.mCenterRadius;
+
+ this.mDuration = builder.mDuration > 0 ? builder.mDuration : this.mDuration;
+
+ this.mColor = builder.mColor != 0 ? builder.mColor : this.mColor;
+
+ this.mGearCount = builder.mGearCount > 0 ? builder.mGearCount : this.mGearCount;
+ this.mGearSwipeDegrees = builder.mGearSwipeDegrees > 0 ? builder.mGearSwipeDegrees : this.mGearSwipeDegrees;
+
+ setupPaint();
+ initStrokeInset(this.mWidth, this.mHeight);
+ }
+
+ public static class Builder {
+ private Context mContext;
+
+ private int mWidth;
+ private int mHeight;
+ private int mStrokeWidth;
+ private int mCenterRadius;
+
+ private int mDuration;
+
+ private int mColor;
+
+ private int mGearCount;
+ private int mGearSwipeDegrees;
+
+ public Builder(Context mContext) {
+ this.mContext = mContext;
+ }
+
+ public Builder setWidth(int width) {
+ this.mWidth = width;
+ return this;
+ }
+
+ public Builder setHeight(int height) {
+ this.mHeight = height;
+ return this;
+ }
+
+ public Builder setStrokeWidth(int strokeWidth) {
+ this.mStrokeWidth = strokeWidth;
+ return this;
+ }
+
+ public Builder setCenterRadius(int centerRadius) {
+ this.mCenterRadius = centerRadius;
+ return this;
+ }
+
+ public Builder setDuration(int duration) {
+ this.mDuration = duration;
+ return this;
+ }
+
+ public Builder setColor(int color) {
+ this.mColor = color;
+ return this;
+ }
+
+ public Builder setGearCount(int gearCount) {
+ this.mGearCount = gearCount;
+ return this;
+ }
+
+ public Builder setGearSwipeDegrees(@IntRange(from = 0, to = 360) int gearSwipeDegrees) {
+ this.mGearSwipeDegrees = gearSwipeDegrees;
+ return this;
+ }
+
+ public GearLoadingRenderer build() {
+ GearLoadingRenderer loadingRenderer = new GearLoadingRenderer(mContext);
+ loadingRenderer.apply(this);
+ return loadingRenderer;
+ }
+ }
+}
@@ -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> |