From 4486680d48f6824eae6f3e6d6d67fa748ba17f8e Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Fri, 29 Jul 2016 00:25:59 +0800 Subject: [PATCH 01/14] optimize code and adjust the permission of some methods --- .../app/dinus/com/example/AnimalActivity.java | 5 - .../dinus/com/example/CircleJumpActivity.java | 7 -- .../com/example/CircleRotateActivity.java | 7 -- .../app/dinus/com/example/GoodsActivity.java | 6 - .../dinus/com/example/SceneryActivity.java | 5 - .../com/example/ShapeChangeActivity.java | 5 - .../com/loadingdrawable/LoadingView.java | 1 + .../{ => render}/LoadingDrawable.java | 6 +- .../render/LoadingRenderer.java | 103 ++++++++---------- .../render/animal/FishLoadingRenderer.java | 2 +- .../animal/GhostsEyeLoadingRenderer.java | 2 +- .../circle/jump/CollisionLoadingRenderer.java | 12 +- .../circle/jump/DanceLoadingRenderer.java | 12 +- .../circle/jump/GuardLoadingRenderer.java | 14 +-- .../circle/jump/SwapLoadingRenderer.java | 8 +- .../circle/rotate/GearLoadingRenderer.java | 6 +- .../circle/rotate/LevelLoadingRenderer.java | 6 +- .../rotate/MaterialLoadingRenderer.java | 11 +- .../circle/rotate/WhorlLoadingRenderer.java | 6 +- .../render/goods/BalloonLoadingRenderer.java | 6 +- .../goods/WaterBottleLoadingRenderer.java | 6 +- .../scenery/DayNightLoadingRenderer.java | 6 +- .../scenery/ElectricFanLoadingRenderer.java | 10 +- .../CircleBroodLoadingRenderer.java | 6 +- .../shapechange/CoolWaitLoadingRenderer.java | 6 +- 25 files changed, 108 insertions(+), 156 deletions(-) rename library/src/main/java/app/dinus/com/loadingdrawable/{ => render}/LoadingDrawable.java (92%) diff --git a/app/src/main/java/app/dinus/com/example/AnimalActivity.java b/app/src/main/java/app/dinus/com/example/AnimalActivity.java index fde72d1..45c1bee 100644 --- a/app/src/main/java/app/dinus/com/example/AnimalActivity.java +++ b/app/src/main/java/app/dinus/com/example/AnimalActivity.java @@ -4,11 +4,6 @@ import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.widget.ImageView; - -import app.dinus.com.loadingdrawable.LoadingDrawable; -import app.dinus.com.loadingdrawable.render.animal.FishLoadingRenderer; -import app.dinus.com.loadingdrawable.render.animal.GhostsEyeLoadingRenderer; public class AnimalActivity extends AppCompatActivity { public static void startActivity(Context context) { diff --git a/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java b/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java index 313c0a2..bf95c98 100644 --- a/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java +++ b/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java @@ -4,13 +4,6 @@ import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.widget.ImageView; - -import app.dinus.com.loadingdrawable.LoadingDrawable; -import app.dinus.com.loadingdrawable.render.circle.jump.CollisionLoadingRenderer; -import app.dinus.com.loadingdrawable.render.circle.jump.DanceLoadingRenderer; -import app.dinus.com.loadingdrawable.render.circle.jump.GuardLoadingRenderer; -import app.dinus.com.loadingdrawable.render.circle.jump.SwapLoadingRenderer; public class CircleJumpActivity extends AppCompatActivity { public static void startActivity(Context context) { diff --git a/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java b/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java index a4fdf8e..8a26e22 100644 --- a/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java +++ b/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java @@ -4,13 +4,6 @@ import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.widget.ImageView; - -import app.dinus.com.loadingdrawable.LoadingDrawable; -import app.dinus.com.loadingdrawable.render.circle.rotate.GearLoadingRenderer; -import app.dinus.com.loadingdrawable.render.circle.rotate.LevelLoadingRenderer; -import app.dinus.com.loadingdrawable.render.circle.rotate.MaterialLoadingRenderer; -import app.dinus.com.loadingdrawable.render.circle.rotate.WhorlLoadingRenderer; public class CircleRotateActivity extends AppCompatActivity { public static void startActivity(Context context) { diff --git a/app/src/main/java/app/dinus/com/example/GoodsActivity.java b/app/src/main/java/app/dinus/com/example/GoodsActivity.java index 1bfe40e..552b59f 100644 --- a/app/src/main/java/app/dinus/com/example/GoodsActivity.java +++ b/app/src/main/java/app/dinus/com/example/GoodsActivity.java @@ -4,12 +4,6 @@ import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.widget.ImageView; - -import app.dinus.com.loadingdrawable.LoadingDrawable; -import app.dinus.com.loadingdrawable.render.animal.GhostsEyeLoadingRenderer; -import app.dinus.com.loadingdrawable.render.goods.BalloonLoadingRenderer; -import app.dinus.com.loadingdrawable.render.goods.WaterBottleLoadingRenderer; public class GoodsActivity extends AppCompatActivity { diff --git a/app/src/main/java/app/dinus/com/example/SceneryActivity.java b/app/src/main/java/app/dinus/com/example/SceneryActivity.java index 545c39f..b6756aa 100644 --- a/app/src/main/java/app/dinus/com/example/SceneryActivity.java +++ b/app/src/main/java/app/dinus/com/example/SceneryActivity.java @@ -4,11 +4,6 @@ import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.widget.ImageView; - -import app.dinus.com.loadingdrawable.LoadingDrawable; -import app.dinus.com.loadingdrawable.render.scenery.DayNightLoadingRenderer; -import app.dinus.com.loadingdrawable.render.scenery.ElectricFanLoadingRenderer; public class SceneryActivity extends AppCompatActivity { diff --git a/app/src/main/java/app/dinus/com/example/ShapeChangeActivity.java b/app/src/main/java/app/dinus/com/example/ShapeChangeActivity.java index a278d35..5cc5d83 100644 --- a/app/src/main/java/app/dinus/com/example/ShapeChangeActivity.java +++ b/app/src/main/java/app/dinus/com/example/ShapeChangeActivity.java @@ -4,11 +4,6 @@ import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.widget.ImageView; - -import app.dinus.com.loadingdrawable.LoadingDrawable; -import app.dinus.com.loadingdrawable.render.shapechange.CircleBroodLoadingRenderer; -import app.dinus.com.loadingdrawable.render.shapechange.CoolWaitLoadingRenderer; public class ShapeChangeActivity extends AppCompatActivity { diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/LoadingView.java b/library/src/main/java/app/dinus/com/loadingdrawable/LoadingView.java index d919880..3901ebe 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/LoadingView.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/LoadingView.java @@ -6,6 +6,7 @@ import android.view.View; import android.widget.ImageView; +import app.dinus.com.loadingdrawable.render.LoadingDrawable; import app.dinus.com.loadingdrawable.render.LoadingRenderer; import app.dinus.com.loadingdrawable.render.LoadingRendererFactory; diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/LoadingDrawable.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingDrawable.java similarity index 92% rename from library/src/main/java/app/dinus/com/loadingdrawable/LoadingDrawable.java rename to library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingDrawable.java index e021df3..a1368c4 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/LoadingDrawable.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingDrawable.java @@ -1,4 +1,4 @@ -package app.dinus.com.loadingdrawable; +package app.dinus.com.loadingdrawable.render; import android.graphics.Canvas; import android.graphics.ColorFilter; @@ -70,11 +70,11 @@ public boolean isRunning() { @Override public int getIntrinsicHeight() { - return (int) mLoadingRender.getHeight(); + return (int) mLoadingRender.mHeight; } @Override public int getIntrinsicWidth() { - return (int) mLoadingRender.getWidth(); + return (int) mLoadingRender.mWidth; } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRenderer.java index d74efe4..9db43c7 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRenderer.java @@ -7,9 +7,10 @@ import android.graphics.ColorFilter; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.util.DisplayMetrics; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; import android.view.animation.Animation; -import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import app.dinus.com.loadingdrawable.DensityUtil; @@ -18,51 +19,71 @@ public abstract class LoadingRenderer { private static final long ANIMATION_DURATION = 1333; private static final float DEFAULT_SIZE = 56.0f; - protected float mWidth; - protected float mHeight; + private final ValueAnimator.AnimatorUpdateListener mAnimatorUpdateListener + = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + computeRender((float) animation.getAnimatedValue()); + invalidateSelf(); + } + }; - private long mDuration; private Drawable.Callback mCallback; private ValueAnimator mRenderAnimator; + protected long mDuration; + + protected float mWidth; + protected float mHeight; + public LoadingRenderer(Context context) { - setupDefaultParams(context); + initParams(context); setupAnimators(); } - public abstract void draw(Canvas canvas, Rect bounds); + protected abstract void draw(Canvas canvas, Rect bounds); - public abstract void computeRender(float renderProgress); + protected abstract void computeRender(float renderProgress); - public abstract void setAlpha(int alpha); + protected abstract void setAlpha(int alpha); - public abstract void setColorFilter(ColorFilter cf); + protected abstract void setColorFilter(ColorFilter cf); - public abstract void reset(); + protected abstract void reset(); - public void start() { + protected void addRenderListener(Animator.AnimatorListener animatorListener) { + mRenderAnimator.addListener(animatorListener); + } + + void start() { reset(); - setDuration(mDuration); + mRenderAnimator.addUpdateListener(mAnimatorUpdateListener); + + mRenderAnimator.setRepeatCount(ValueAnimator.INFINITE); + mRenderAnimator.setDuration(mDuration); mRenderAnimator.start(); } - public void stop() { - mRenderAnimator.cancel(); + void stop() { + // if I just call mRenderAnimator.end(), + // it will always call the method onAnimationUpdate(ValueAnimator animation) + // why ? if you know why please send email to me (dinus_developer@163.com) + mRenderAnimator.removeUpdateListener(mAnimatorUpdateListener); + + mRenderAnimator.setRepeatCount(0); + mRenderAnimator.setDuration(0); + mRenderAnimator.end(); } - public boolean isRunning() { + boolean isRunning() { return mRenderAnimator.isRunning(); } - public void setCallback(Drawable.Callback callback) { + void setCallback(Drawable.Callback callback) { this.mCallback = callback; } - protected void invalidateSelf() { - mCallback.invalidateDrawable(null); - } - - private void setupDefaultParams(Context context) { + private void initParams(Context context) { mWidth = DensityUtil.dip2px(context, DEFAULT_SIZE); mHeight = DensityUtil.dip2px(context, DEFAULT_SIZE); @@ -73,44 +94,14 @@ private void setupAnimators() { mRenderAnimator = ValueAnimator.ofFloat(0.0f, 1.0f); mRenderAnimator.setRepeatCount(Animation.INFINITE); mRenderAnimator.setRepeatMode(Animation.RESTART); + mRenderAnimator.setDuration(mDuration); //fuck you! the default interpolator is AccelerateDecelerateInterpolator mRenderAnimator.setInterpolator(new LinearInterpolator()); - mRenderAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override - public void onAnimationUpdate(ValueAnimator animation) { - computeRender((float) animation.getAnimatedValue()); - invalidateSelf(); - } - }); - - } - - protected void addRenderListener(Animator.AnimatorListener animatorListener) { - mRenderAnimator.addListener(animatorListener); - } - - public float getWidth() { - return mWidth; - } - - public void setWidth(float width) { - this.mWidth = width; - } - - public float getHeight() { - return mHeight; - } - - public void setHeight(float height) { - this.mHeight = height; + mRenderAnimator.addUpdateListener(mAnimatorUpdateListener); } - public long getDuration() { - return mDuration; + private void invalidateSelf() { + mCallback.invalidateDrawable(null); } - public void setDuration(long duration) { - this.mDuration = duration; - mRenderAnimator.setDuration(mDuration); - } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/FishLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/FishLoadingRenderer.java index 7c6f63d..5e76fe7 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/FishLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/FishLoadingRenderer.java @@ -91,7 +91,7 @@ private void init(Context context) { mColor = DEFAULT_COLOR; - setDuration(ANIMATION_DURATION); + mDuration = ANIMATION_DURATION; } private void setupPaint() { diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/GhostsEyeLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/GhostsEyeLoadingRenderer.java index dfd9a52..2ff3845 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/GhostsEyeLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/GhostsEyeLoadingRenderer.java @@ -87,7 +87,7 @@ private void init(Context context) { mColor = DEFAULT_COLOR; - setDuration(ANIMATION_DURATION); + mDuration = ANIMATION_DURATION; } private void setupPaint() { diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java index fc070d3..5cc9253 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java @@ -136,7 +136,7 @@ public void computeRender(float renderProgress) { float startLeftOffsetProgress = renderProgress / DURATION_OFFSET; mStartXOffsetProgress = DECELERATE_INTERPOLATOR.getInterpolation(startLeftOffsetProgress); - invalidateSelf(); + return; } @@ -146,7 +146,7 @@ public void computeRender(float renderProgress) { float startRightOffsetProgress = (renderProgress - START_LEFT_DURATION_OFFSET) / DURATION_OFFSET; mStartXOffsetProgress = ACCELERATE_INTERPOLATOR.getInterpolation(1.0f - startRightOffsetProgress); - invalidateSelf(); + return; } @@ -156,7 +156,7 @@ public void computeRender(float renderProgress) { float endRightOffsetProgress = (renderProgress - START_RIGHT_DURATION_OFFSET) / DURATION_OFFSET; mEndXOffsetProgress = DECELERATE_INTERPOLATOR.getInterpolation(endRightOffsetProgress); - invalidateSelf(); + return; } @@ -166,7 +166,7 @@ public void computeRender(float renderProgress) { float endRightOffsetProgress = (renderProgress - END_RIGHT_DURATION_OFFSET) / DURATION_OFFSET; mEndXOffsetProgress = ACCELERATE_INTERPOLATOR.getInterpolation(1 - endRightOffsetProgress); - invalidateSelf(); + return; } } @@ -174,13 +174,13 @@ public void computeRender(float renderProgress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/DanceLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/DanceLoadingRenderer.java index cef6131..0c06e72 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/DanceLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/DanceLoadingRenderer.java @@ -95,8 +95,8 @@ private void init(Context context) { mDanceBallRadius = DensityUtil.dip2px(context, DEFAULT_DANCE_BALL_RADIUS); setColor(DEFAULT_COLOR); - setInsets((int) getWidth(), (int) getHeight()); - setDuration(ANIMATION_DURATION); + setInsets((int) mWidth, (int) mHeight); + mDuration = ANIMATION_DURATION; } private void setupPaint() { @@ -261,13 +261,13 @@ public void computeRender(float renderProgress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override @@ -283,12 +283,12 @@ public void setColor(int color) { public void setRotation(float rotation) { mRotation = rotation; - invalidateSelf(); + } public void setDanceBallRadius(float danceBallRadius) { this.mDanceBallRadius = danceBallRadius; - invalidateSelf(); + } public float getDanceBallRadius() { diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/GuardLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/GuardLoadingRenderer.java index 3ce439a..b3eae7a 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/GuardLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/GuardLoadingRenderer.java @@ -68,7 +68,7 @@ public class GuardLoadingRenderer extends LoadingRenderer { public GuardLoadingRenderer(Context context) { super(context); - setDuration(ANIMATION_DURATION); + mDuration = ANIMATION_DURATION; init(context); setupPaint(); } @@ -88,7 +88,7 @@ private void setupPaint() { mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeCap(Paint.Cap.ROUND); - setInsets((int) getWidth(), (int) getHeight()); + setInsets((int) mWidth, (int) mHeight); } @Override @@ -182,13 +182,13 @@ public void computeRender(float renderProgress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override @@ -239,7 +239,7 @@ private Path createSkipBallPath() { public void setStartTrim(float startTrim) { mStartTrim = startTrim; - invalidateSelf(); + } public float getStartTrim() { @@ -248,7 +248,7 @@ public float getStartTrim() { public void setEndTrim(float endTrim) { mEndTrim = endTrim; - invalidateSelf(); + } public float getEndTrim() { @@ -257,7 +257,7 @@ public float getEndTrim() { public void setRotation(float rotation) { mRotation = rotation; - invalidateSelf(); + } public void setScale(float scale) { diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java index 423df50..3b45492 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java @@ -45,7 +45,7 @@ public class SwapLoadingRenderer extends LoadingRenderer { public SwapLoadingRenderer(Context context) { super(context); - setDuration(ANIMATION_DURATION); + mDuration = ANIMATION_DURATION; init(context); setupPaint(); } @@ -134,19 +134,19 @@ public void computeRender(float renderProgress) { mSwapXOffsetProgress = MATERIAL_INTERPOLATOR.getInterpolation( (renderProgress - mSwapIndex * mSwapThreshold) / mSwapThreshold); - invalidateSelf(); + } @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java index ac5182d..e949525 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java @@ -103,7 +103,7 @@ private void setupPaint() { mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeCap(Paint.Cap.ROUND); - setInsets((int) getWidth(), (int) getHeight()); + setInsets((int) mWidth, (int) mHeight); } @Override @@ -171,13 +171,13 @@ public void computeRender(float renderProgress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java index a38534e..5a7ba29 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java @@ -108,7 +108,7 @@ private void setupPaint() { mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeCap(Paint.Cap.ROUND); - setInsets((int) getWidth(), (int) getHeight()); + setInsets((int) mWidth, (int) mHeight); } @Override @@ -186,13 +186,13 @@ public void computeRender(float renderProgress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java index f4ebc8f..99ec464 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java @@ -94,7 +94,7 @@ private void init(Context context) { mColors = DEFAULT_COLORS; setColorIndex(0); - setInsets((int) getWidth(), (int) getHeight()); + setInsets((int) mWidth, (int) mHeight); } private void setupPaint() { @@ -149,13 +149,13 @@ public void computeRender(float renderProgress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override @@ -241,9 +241,4 @@ private int evaluateColorChange(float fraction, int startValue, int endValue) { | ((startG + (int) (fraction * (endG - startG))) << 8) | ((startB + (int) (fraction * (endB - startB)))); } - - public static class Builder { - - - } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java index eecb02c..1929ce7 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java @@ -87,7 +87,7 @@ private void init(Context context) { mColors = DEFAULT_COLORS; mStrokeWidth = DensityUtil.dip2px(context, DEFAULT_STROKE_WIDTH); mCenterRadius = DensityUtil.dip2px(context, DEFAULT_CENTER_RADIUS); - setInsets((int) getWidth(), (int) getHeight()); + setInsets((int) mWidth, (int) mHeight); } private void setupPaint() { @@ -160,13 +160,13 @@ public void computeRender(float renderProgress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/BalloonLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/BalloonLoadingRenderer.java index 283f69e..474a632 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/BalloonLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/BalloonLoadingRenderer.java @@ -110,7 +110,7 @@ private void init(Context context) { mProgressText = 10 + PERCENT_SIGN; - setDuration(ANIMATION_DURATION); + mDuration = ANIMATION_DURATION; } private void setupPaint() { @@ -284,13 +284,13 @@ private Path createBalloonPath(RectF balloonRect, float progress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/WaterBottleLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/WaterBottleLoadingRenderer.java index 92ebe92..15084f4 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/WaterBottleLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/WaterBottleLoadingRenderer.java @@ -88,7 +88,7 @@ private void init(Context context) { mWaveCount = DEFAULT_WAVE_COUNT; - setDuration(ANIMATION_DURATION); + mDuration = ANIMATION_DURATION; } private void setupPaint() { @@ -280,13 +280,13 @@ private float getMaxRiseHeight(float bottleRadius, float waterDropRadius, float @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/DayNightLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/DayNightLoadingRenderer.java index 42b9406..6bf2592 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/DayNightLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/DayNightLoadingRenderer.java @@ -140,7 +140,7 @@ private void init(Context context) { mCurrentColor = DEFAULT_COLOR; - setDuration(ANIMATION_DURATION); + mDuration = ANIMATION_DURATION; } private void setupPaint() { @@ -275,13 +275,13 @@ public void computeRender(float renderProgress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/ElectricFanLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/ElectricFanLoadingRenderer.java index e325b3b..d5da07f 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/ElectricFanLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/ElectricFanLoadingRenderer.java @@ -146,8 +146,8 @@ private void init(Context context) { mLoadingDrawable = context.getResources().getDrawable(R.drawable.ic_loading); mElectricFanDrawable = context.getResources().getDrawable(R.drawable.ic_eletric_fan); - setDuration(ANIMATION_DURATION); - setInsets((int) getWidth(), (int) getHeight()); + mDuration = ANIMATION_DURATION; + setInsets((int) mWidth, (int) mHeight); } private void setupPaint() { @@ -307,13 +307,13 @@ public void computeRender(float renderProgress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override @@ -374,7 +374,7 @@ private ValueAnimator getBezierValueAnimator(LeafHolder target, RectF leafFlyRec animator.addUpdateListener(new BezierListener(target)); animator.setTarget(target); - animator.setDuration((long) ((mRandom.nextInt(300) + getDuration() * DEFAULT_LEAF_FLY_DURATION_FACTOR) * (1.0f - progress))); + animator.setDuration((long) ((mRandom.nextInt(300) + mDuration * DEFAULT_LEAF_FLY_DURATION_FACTOR) * (1.0f - progress))); return animator; } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CircleBroodLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CircleBroodLoadingRenderer.java index d8dbbf4..8bdc93d 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CircleBroodLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CircleBroodLoadingRenderer.java @@ -131,7 +131,7 @@ private void init(Context context) { mMaxRevealCircleRadius = (int) (Math.sqrt(mWidth * mWidth + mHeight * mHeight) / 2 + 1); - setDuration(ANIMATION_DURATION); + mDuration = ANIMATION_DURATION; } private void setupPaint() { @@ -600,13 +600,13 @@ private float getRestLength(Path path, float startD) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CoolWaitLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CoolWaitLoadingRenderer.java index 85dc7ed..253a8c2 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CoolWaitLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CoolWaitLoadingRenderer.java @@ -76,7 +76,7 @@ private void init(Context context) { mMiddleColor = Color.parseColor("#FFF3C742"); mBottomColor = Color.parseColor("#FF89CC59"); - setDuration(ANIMATION_DURATION); + mDuration = ANIMATION_DURATION; } private void setupPaint() { @@ -242,13 +242,13 @@ public void computeRender(float renderProgress) { @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); - invalidateSelf(); + } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - invalidateSelf(); + } @Override From d924d2fb04433e405215f494342c1a97ddb5044d Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Thu, 4 Aug 2016 00:57:00 +0800 Subject: [PATCH 02/14] add Builder for all the LoadingRenderer --- README-ZH.md | 94 -------- README.md | 46 ++-- .../com/example/CircleRotateActivity.java | 7 + .../render/LoadingDrawable.java | 27 ++- .../render/LoadingRenderer.java | 19 +- .../render/LoadingRendererFactory.java | 1 + .../render/animal/FishLoadingRenderer.java | 25 +- .../animal/GhostsEyeLoadingRenderer.java | 25 +- .../circle/jump/CollisionLoadingRenderer.java | 27 ++- .../circle/jump/DanceLoadingRenderer.java | 37 ++- .../circle/jump/GuardLoadingRenderer.java | 70 ++---- .../circle/jump/SwapLoadingRenderer.java | 25 +- .../circle/rotate/GearLoadingRenderer.java | 31 ++- .../circle/rotate/LevelLoadingRenderer.java | 222 ++++++++++-------- .../rotate/MaterialLoadingRenderer.java | 131 +++++++---- .../circle/rotate/WhorlLoadingRenderer.java | 31 ++- .../render/goods/BalloonLoadingRenderer.java | 26 +- .../goods/WaterBottleLoadingRenderer.java | 25 +- .../scenery/DayNightLoadingRenderer.java | 25 +- .../scenery/ElectricFanLoadingRenderer.java | 31 ++- .../CircleBroodLoadingRenderer.java | 25 +- .../shapechange/CoolWaitLoadingRenderer.java | 23 +- 22 files changed, 553 insertions(+), 420 deletions(-) delete mode 100644 README-ZH.md diff --git a/README-ZH.md b/README-ZH.md deleted file mode 100644 index 26cd368..0000000 --- a/README-ZH.md +++ /dev/null @@ -1,94 +0,0 @@ - -## LoadingDrawable -[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-LoadingDrawable-brightgreen.svg?style=flat)](http://android-arsenal.com/details/1/3450) - - 一些酷炫的加载动画, 可以与任何View配合使用,作为加载动画或者Progressbar, 此外很适合与[RecyclerRefreshLayout](https://github.com/dinuscxj/RecyclerRefreshLayout) - 配合使用作为刷新的loading 动画
- - 这个项目的思路源于这个动画链接 [link] (http://mp.weixin.qq.com/s?__biz=MjM5MDMxOTE5NA==&mid=402703079&idx=2&sn=2fcc6746a866dcc003c68ead9b68e595&scene=2&srcid=0302A7p723KK8E5gSzLKb2ZL&from=timeline&isappinstalled=0#wechat_redirect).
- 或许你更喜欢使用Gif实现 : [GifLoadingView] (https://github.com/Rogero0o/GifLoadingView).
- -![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/ShapeChangeDrawable.gif) -![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/GoodsDrawable.gif) -![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/AnimalDrawable.gif) -![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/SceneryDrawable.gif) -![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/CircleJumpDrawable.gif) -![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/CircleRotateDrawable.gif) - -## 功能 - -#### 形变系列 - * CircleBroodLoadingRenderer - * CoolWaitLoadingRenderer - -#### 物品系列 - * BalloonLoadingRenderer - * WaterBottleLoadingRenderer - -#### 动物系列 - * FishLoadingRenderer - * GhostsEyeLoadingRenderer - -#### 风景系列 - * DayNightLoadingRenderer - * ElectricFanLoadingRenderer - -#### 圆形滚动系列 - * GearLoadingRenderer - * WhorlLoadingRenderer - * LevelLoadingRenderer - * MaterialLoadingRenderer - -#### 圆形跳动系列 - * SwapLoadingRenderer - * GuardLoadingRenderer - * DanceLoadingRenderer - * CollisionLoadingRenderer - -## 待办事项 -当我感觉bug比较少的时候,我会添加一个gradle依赖。 所以在推上去之前希望大家多提提建议和bug. - -## 用法 -#### Gradle - ``` - compile project(':library') - ``` -#### 在代码里 - - ```java - LoadingView.setLoadingRenderer(LoadingRenderer); - ``` - -#### 在xml中 - ```xml - - ``` - -如果LoadingView不能满足你的需求,或许你需要参考LoadingView进行自定义View - -## 杂谈 -如果你喜欢LoadingDrawable或者在使用它, 你可以 - - * star这个项目 - * 提一些建议, 谢谢。 - -## License - Copyright 2015-2019 dinus - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md index 528b43c..687ee39 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,23 @@ ## LoadingDrawable: Android cool animation collection -[中文版文档](https://github.com/dinuscxj/LoadingDrawable/blob/master/README-ZH.md)    [前言](http://www.jianshu.com/p/6e0ac5af4e8b)    [Circle系列源码解析](http://www.jianshu.com/p/1c3c6fc1b7ff)    [Fish源码解析](http://blog.csdn.net/XSF50717/article/details/51494266)
[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-LoadingDrawable-brightgreen.svg?style=flat)](http://android-arsenal.com/details/1/3450) - Some android loading drawable, can be combined with any View as the loading View and Progressbar, - - This project idea is from the [link] (http://mp.weixin.qq.com/s?__biz=MjM5MDMxOTE5NA==&mid=402703079&idx=2&sn=2fcc6746a866dcc003c68ead9b68e595&scene=2&srcid=0302A7p723KK8E5gSzLKb2ZL&from=timeline&isappinstalled=0#wechat_redirect).
- Perhaps you prefer to use gif way to achieve : [GifLoadingView] (https://github.com/Rogero0o/GifLoadingView).
+ LoadingDrawable is some android animations implement of drawable: a library can be used in the pull-down to refresh, the placeholders of image loading and the time-consuming tasks. This project idea is from the [link] (http://mp.weixin.qq.com/s?__biz=MjM5MDMxOTE5NA==&mid=402703079&idx=2&sn=2fcc6746a866dcc003c68ead9b68e595&scene=2&srcid=0302A7p723KK8E5gSzLKb2ZL&from=timeline&isappinstalled=0#wechat_redirect).
+ The following content show a brief overview of LoadingDrawable + + * It extends `Drawable` and implement the interface `Animatable` + * it uses strategy mode + * It can be used as the background of View or content of `ImageView` + * It's constructor must be passed a `LoadingRenderer` + * It interact with `LoadingRenderer` by the callback `Callback` + * `LoadingRenderer` is used for measuring and drawing the `LoadingDrawable`. note: + `LoadingRenderer` is the core + * `LoadingRenderer` only can be created by their `Builder`. + + Learn more about LoadingDrawable on the [Wiki Home] (https://github.com/dinuscxj/LoadingDrawable/wiki). ![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/ShapeChangeDrawable.gif) ![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/GoodsDrawable.gif) @@ -18,7 +26,7 @@ ![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/CircleJumpDrawable.gif) ![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/CircleRotateDrawable.gif) -## Features +## LoadingRenderer Style #### ShapeChange * CircleBroodLoadingRenderer @@ -48,22 +56,8 @@ * DanceLoadingRenderer * CollisionLoadingRenderer -## TODO - When I feel less bugs enough, I will add a gradle dependency. So I hope you will make more Suggestions or Issues. - ## Usage -#### Gradle - ``` - compile project(':library') - ``` -#### In java - - ```java - LoadingView.setLoadingRenderer(LoadingRenderer); - ``` - -#### In xml - + Define the `LoadingView` in XML and specify the `LoadingRenderer` style: ```xml ``` - -If the LoadingView can't meet your requirements, you might need to refer to the LoadingView customize the View you need + Or specify the `LoadingRenderer` style in Java + ```java + ***LoadingRenderer.Builder builder = new ***LoadingRenderer.Builder(context); + LoadingView.setLoadingRenderer(builder.build()); + ``` + +## TODO + When I feel less bugs enough, I will add a gradle dependency. So I hope you will make more Suggestions or Issues. ## Misc If you like LoadingDrawable or use it, could you please: diff --git a/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java b/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java index 8a26e22..8c23d63 100644 --- a/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java +++ b/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java @@ -2,9 +2,16 @@ import android.content.Context; import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import app.dinus.com.loadingdrawable.DensityUtil; +import app.dinus.com.loadingdrawable.LoadingView; +import app.dinus.com.loadingdrawable.render.LoadingRenderer; +import app.dinus.com.loadingdrawable.render.circle.rotate.LevelLoadingRenderer; +import app.dinus.com.loadingdrawable.render.circle.rotate.MaterialLoadingRenderer; + public class CircleRotateActivity extends AppCompatActivity { public static void startActivity(Context context) { Intent intent = new Intent(context, CircleRotateActivity.class); diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingDrawable.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingDrawable.java index a1368c4..0c30ed6 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingDrawable.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingDrawable.java @@ -3,13 +3,14 @@ import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.PixelFormat; +import android.graphics.Rect; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import app.dinus.com.loadingdrawable.render.LoadingRenderer; public class LoadingDrawable extends Drawable implements Animatable { - private LoadingRenderer mLoadingRender; + private final LoadingRenderer mLoadingRender; private final Callback mCallback = new Callback() { @Override @@ -33,19 +34,27 @@ public LoadingDrawable(LoadingRenderer loadingRender) { this.mLoadingRender.setCallback(mCallback); } + @Override + protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + this.mLoadingRender.setBounds(bounds); + } + @Override public void draw(Canvas canvas) { - mLoadingRender.draw(canvas, getBounds()); + if (!getBounds().isEmpty()) { + this.mLoadingRender.draw(canvas); + } } @Override public void setAlpha(int alpha) { - mLoadingRender.setAlpha(alpha); + this.mLoadingRender.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { - mLoadingRender.setColorFilter(cf); + this.mLoadingRender.setColorFilter(cf); } @Override @@ -55,26 +64,26 @@ public int getOpacity() { @Override public void start() { - mLoadingRender.start(); + this.mLoadingRender.start(); } @Override public void stop() { - mLoadingRender.stop(); + this.mLoadingRender.stop(); } @Override public boolean isRunning() { - return mLoadingRender.isRunning(); + return this.mLoadingRender.isRunning(); } @Override public int getIntrinsicHeight() { - return (int) mLoadingRender.mHeight; + return (int) this.mLoadingRender.mHeight; } @Override public int getIntrinsicWidth() { - return (int) mLoadingRender.mWidth; + return (int) this.mLoadingRender.mWidth; } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRenderer.java index 9db43c7..fe0282b 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRenderer.java @@ -6,6 +6,7 @@ import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Rect; +import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; @@ -28,6 +29,12 @@ public void onAnimationUpdate(ValueAnimator animation) { } }; + /** + * Whenever {@link LoadingDrawable} boundary changes mBounds will be updated. + * More details you can see {@link LoadingDrawable#onBoundsChange(Rect)} + */ + protected final Rect mBounds = new Rect(); + private Drawable.Callback mCallback; private ValueAnimator mRenderAnimator; @@ -41,7 +48,13 @@ public LoadingRenderer(Context context) { setupAnimators(); } - protected abstract void draw(Canvas canvas, Rect bounds); + @Deprecated + protected void draw(Canvas canvas, Rect bounds) { + } + + protected void draw(Canvas canvas) { + draw(canvas, mBounds); + } protected abstract void computeRender(float renderProgress); @@ -83,6 +96,10 @@ void setCallback(Drawable.Callback callback) { this.mCallback = callback; } + void setBounds(Rect bounds) { + mBounds.set(bounds); + } + private void initParams(Context context) { mWidth = DensityUtil.dip2px(context, DEFAULT_SIZE); mHeight = DensityUtil.dip2px(context, DEFAULT_SIZE); diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRendererFactory.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRendererFactory.java index 45227db..59040b0 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRendererFactory.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/LoadingRendererFactory.java @@ -61,6 +61,7 @@ public static LoadingRenderer createLoadingRenderer(Context context, int loading if (parameterTypes != null && parameterTypes.length == 1 && parameterTypes[0].equals(Context.class)) { + constructor.setAccessible(true); return (LoadingRenderer) constructor.newInstance(context); } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/FishLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/FishLoadingRenderer.java index 5e76fe7..2c63d48 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/FishLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/FishLoadingRenderer.java @@ -70,7 +70,7 @@ public class FishLoadingRenderer extends LoadingRenderer { private int mColor; - public FishLoadingRenderer(Context context) { + private FishLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -103,7 +103,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); RectF arcBounds = mTempBounds; arcBounds.set(bounds); @@ -153,7 +153,7 @@ private float calculateRotateDegrees(float fishProgress) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { if (mRiverPath == null) { return; } @@ -169,17 +169,17 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { } @Override - public void reset() { + protected void reset() { } private Path createFishEyePath(float fishEyeCenterX, float fishEyeCenterY) { @@ -246,4 +246,17 @@ public float getInterpolation(float input) { return FISH_MOVE_POINTS[index]; } } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public FishLoadingRenderer build() { + FishLoadingRenderer loadingRenderer = new FishLoadingRenderer(mContext); + return loadingRenderer; + } + } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/GhostsEyeLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/GhostsEyeLoadingRenderer.java index 2ff3845..b13b2a8 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/GhostsEyeLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/animal/GhostsEyeLoadingRenderer.java @@ -65,7 +65,7 @@ public class GhostsEyeLoadingRenderer extends LoadingRenderer { private int mColor; - public GhostsEyeLoadingRenderer(Context context) { + private GhostsEyeLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -99,7 +99,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); RectF arcBounds = mTempBounds; arcBounds.set(bounds); @@ -120,7 +120,7 @@ public void draw(Canvas canvas, Rect bounds) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { if (renderProgress <= LEFT_EYE_BALL_END_JUMP_OFFSET && renderProgress >= LEFT_EYE_CIRCLE$BALL_START_JUMP_UP_OFFSET) { float eyeCircle$BallJumpUpProgress = (renderProgress - LEFT_EYE_CIRCLE$BALL_START_JUMP_UP_OFFSET) / (LEFT_EYE_BALL_END_JUMP_OFFSET - LEFT_EYE_CIRCLE$BALL_START_JUMP_UP_OFFSET); mLeftEyeBallOffsetY = -mMaxEyeJumptDistance * EYE_BALL_INTERPOLATOR.getInterpolation(eyeCircle$BallJumpUpProgress); @@ -143,17 +143,17 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { } @Override - public void reset() { + protected void reset() { mLeftEyeBallOffsetY = 0.0f; mRightEyeBallOffsetY = 0.0f; mLeftEyeCircleOffsetY = 0.0f; @@ -245,4 +245,17 @@ public float getInterpolation(float input) { } } } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public GhostsEyeLoadingRenderer build() { + GhostsEyeLoadingRenderer loadingRenderer = new GhostsEyeLoadingRenderer(mContext); + return loadingRenderer; + } + } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java index 5cc9253..e41769e 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java @@ -57,7 +57,7 @@ public class CollisionLoadingRenderer extends LoadingRenderer { private float mStrokeWidth; - public CollisionLoadingRenderer(Context context) { + private CollisionLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -79,7 +79,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); RectF arcBounds = mTempBounds; @@ -128,7 +128,7 @@ private float computeCircleRadius(RectF rectBounds) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { // Moving the start offset to left only occurs in the first 25% of a // single ring animation @@ -172,26 +172,31 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override - public void reset() { + protected void reset() { } - public void setColors(@NonNull int[] colors) { - mColors = colors; - } + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } - public void setPositions(@NonNull float[] positions) { - mPositions = positions; + public CollisionLoadingRenderer build() { + CollisionLoadingRenderer loadingRenderer = new CollisionLoadingRenderer(mContext); + return loadingRenderer; + } } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/DanceLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/DanceLoadingRenderer.java index 0c06e72..9d72c9a 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/DanceLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/DanceLoadingRenderer.java @@ -83,7 +83,7 @@ public class DanceLoadingRenderer extends LoadingRenderer { private int mColor; private int mArcColor; - public DanceLoadingRenderer(Context context) { + private DanceLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -106,7 +106,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); mTempBounds.set(bounds); @@ -149,7 +149,7 @@ public void draw(Canvas canvas, Rect bounds) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { float radius = Math.min(mCurrentBounds.height(), mCurrentBounds.width()) / 2.0f; //the origin coordinate is the centerLeft of the field mCurrentBounds float originCoordinateX = mCurrentBounds.left; @@ -259,47 +259,47 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override - public void reset() { + protected void reset() { mScale = 1.0f; mRotation = 0; } - public void setColor(int color) { + private void setColor(int color) { mColor = color; mArcColor = halfAlphaColor(mColor); } - public void setRotation(float rotation) { + private void setRotation(float rotation) { mRotation = rotation; } - public void setDanceBallRadius(float danceBallRadius) { + private void setDanceBallRadius(float danceBallRadius) { this.mDanceBallRadius = danceBallRadius; } - public float getDanceBallRadius() { + private float getDanceBallRadius() { return mDanceBallRadius; } - public float getRotation() { + private float getRotation() { return mRotation; } - public void setInsets(int width, int height) { + private void setInsets(int width, int height) { final float minEdge = (float) Math.min(width, height); float insets; if (mCenterRadius <= 0 || minEdge < 0) { @@ -321,4 +321,17 @@ private int halfAlphaColor(int colorValue) { | (startG << 8) | startB; } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public DanceLoadingRenderer build() { + DanceLoadingRenderer loadingRenderer = new DanceLoadingRenderer(mContext); + return loadingRenderer; + } + } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/GuardLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/GuardLoadingRenderer.java index b3eae7a..7a1c971 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/GuardLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/GuardLoadingRenderer.java @@ -65,7 +65,7 @@ public class GuardLoadingRenderer extends LoadingRenderer { private PathMeasure mPathMeasure; - public GuardLoadingRenderer(Context context) { + private GuardLoadingRenderer(Context context) { super(context); mDuration = ANIMATION_DURATION; @@ -92,7 +92,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { RectF arcBounds = mTempBounds; arcBounds.set(bounds); arcBounds.inset(mStrokeInset, mStrokeInset); @@ -129,7 +129,7 @@ public void draw(Canvas canvas, Rect bounds) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { if (renderProgress <= START_TRIM_DURATION_OFFSET) { final float startTrimProgress = (renderProgress) / START_TRIM_DURATION_OFFSET; mEndTrim = -MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress); @@ -180,19 +180,19 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override - public void reset() { + protected void reset() { mScale = 1.0f; mEndTrim = 0.0f; mRotation = 0.0f; @@ -200,10 +200,6 @@ public void reset() { mWaveProgress = 1.0f; } - public void setColor(int color) { - mColor = color; - } - private Path createSkipBallPath() { float radius = Math.min(mCurrentBounds.width(), mCurrentBounds.height()) / 2.0f; float radiusPow2 = (float) Math.pow(radius, 2.0f); @@ -237,46 +233,7 @@ private Path createSkipBallPath() { return path; } - public void setStartTrim(float startTrim) { - mStartTrim = startTrim; - - } - - public float getStartTrim() { - return mStartTrim; - } - - public void setEndTrim(float endTrim) { - mEndTrim = endTrim; - - } - - public float getEndTrim() { - return mEndTrim; - } - - public void setRotation(float rotation) { - mRotation = rotation; - - } - - public void setScale(float scale) { - this.mScale = scale; - } - - public float getScale() { - return mScale; - } - - public void setSkipBallSize(float skipBallSize) { - this.mSkipBallSize = skipBallSize; - } - - public float getSkipBallSize() { - return mSkipBallSize; - } - - public void setInsets(int width, int height) { + private void setInsets(int width, int height) { final float minEdge = (float) Math.min(width, height); float insets; if (mCenterRadius <= 0 || minEdge < 0) { @@ -286,4 +243,17 @@ public void setInsets(int width, int height) { } mStrokeInset = insets; } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public GuardLoadingRenderer build() { + GuardLoadingRenderer loadingRenderer = new GuardLoadingRenderer(mContext); + return loadingRenderer; + } + } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java index 3b45492..fcea333 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java @@ -42,7 +42,7 @@ public class SwapLoadingRenderer extends LoadingRenderer { private float mStrokeWidth; - public SwapLoadingRenderer(Context context) { + private SwapLoadingRenderer(Context context) { super(context); mDuration = ANIMATION_DURATION; @@ -67,7 +67,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { mPaint.setColor(mColor); int saveCount = canvas.save(); @@ -129,7 +129,7 @@ private float computeCircleRadius(RectF rectBounds) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { mSwapIndex = (int) (renderProgress / mSwapThreshold); mSwapXOffsetProgress = MATERIAL_INTERPOLATOR.getInterpolation( (renderProgress - mSwapIndex * mSwapThreshold) / mSwapThreshold); @@ -138,22 +138,31 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override - public void reset() { + protected void reset() { } - public void setColor(int color) { - mColor = color; + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public SwapLoadingRenderer build() { + SwapLoadingRenderer loadingRenderer = new SwapLoadingRenderer(mContext); + return loadingRenderer; + } } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java index e949525..4d9f391 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java @@ -82,7 +82,7 @@ public void onAnimationStart(Animator animation) { private float mStrokeWidth; private float mCenterRadius; - public GearLoadingRenderer(Context context) { + private GearLoadingRenderer(Context context) { super(context); init(context); @@ -107,7 +107,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); canvas.rotate(mGroupRotation, bounds.exactCenterX(), bounds.exactCenterY()); @@ -128,7 +128,7 @@ public void draw(Canvas canvas, Rect bounds) { } @Override - public void computeRender(float renderProgress) { + 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) { @@ -169,26 +169,20 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); - } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - } @Override - public void reset() { + protected void reset() { resetOriginals(); } - public void setColor(int color) { - mCurrentColor = color; - } - private void setInsets(int width, int height) { final float minEdge = (float) Math.min(width, height); float insets; @@ -217,4 +211,17 @@ private void resetOriginals() { mSwipeDegrees = MIN_SWIPE_DEGREE; } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public GearLoadingRenderer build() { + GearLoadingRenderer loadingRenderer = new GearLoadingRenderer(mContext); + return loadingRenderer; + } + } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java index 5a7ba29..a09ecf6 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java @@ -9,8 +9,8 @@ import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; +import android.support.annotation.Size; import android.support.v4.view.animation.FastOutSlowInInterpolator; -import android.util.DisplayMetrics; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; @@ -28,13 +28,11 @@ public class LevelLoadingRenderer extends LoadingRenderer { private static final int NUM_POINTS = 5; private static final int DEGREE_360 = 360; - private static final float MIN_SWIPE_DEGREE = 0.1f; private static final float MAX_SWIPE_DEGREES = 0.8f * DEGREE_360; private static final float FULL_GROUP_ROTATION = 3.0f * DEGREE_360; private static final float MAX_ROTATION_INCREMENT = 0.25f * DEGREE_360; - private static final float LEVEL2_SWEEP_ANGLE_OFFSET = 7.0f / 8.0f; - private static final float LEVEL3_SWEEP_ANGLE_OFFSET = 5.0f / 8.0f; + private static final float[] LEVEL_SWEEP_ANGLE_OFFSETS = new float[]{1.0f, 7.0f / 8.0f, 5.0f / 8.0f}; private static final float START_TRIM_DURATION_OFFSET = 0.5f; private static final float END_TRIM_DURATION_OFFSET = 1.0f; @@ -42,7 +40,8 @@ public class LevelLoadingRenderer extends LoadingRenderer { private static final float DEFAULT_CENTER_RADIUS = 12.5f; private static final float DEFAULT_STROKE_WIDTH = 2.5f; - private static final int DEFAULT_COLOR = Color.WHITE; + private static final int[] DEFAULT_LEVEL_COLORS = new int[]{Color.parseColor("#55ffffff"), + Color.parseColor("#b1ffffff"), Color.parseColor("#ffffffff")}; private final Paint mPaint = new Paint(); private final RectF mTempBounds = new RectF(); @@ -64,9 +63,10 @@ public void onAnimationStart(Animator animation) { } }; - private int mLevel1Color; - private int mLevel2Color; - private int mLevel3Color; + @Size(3) + private int[] mLevelColors; + @Size(3) + private float[] mLevelSwipeDegrees; private float mStrokeInset; @@ -75,9 +75,6 @@ public void onAnimationStart(Animator animation) { private float mEndDegrees; private float mStartDegrees; - private float mLevel1SwipeDegrees; - private float mLevel2SwipeDegrees; - private float mLevel3SwipeDegrees; private float mRotationIncrement; private float mOriginEndDegrees; private float mOriginStartDegrees; @@ -86,70 +83,66 @@ public void onAnimationStart(Animator animation) { private float mStrokeWidth; private float mCenterRadius; - public LevelLoadingRenderer(Context context) { + private LevelLoadingRenderer(Context context) { super(context); init(context); setupPaint(); addRenderListener(mAnimatorListener); } - + private void init(Context context) { mStrokeWidth = DensityUtil.dip2px(context, DEFAULT_STROKE_WIDTH); mCenterRadius = DensityUtil.dip2px(context, DEFAULT_CENTER_RADIUS); + + mLevelSwipeDegrees = new float[3]; + mLevelColors = DEFAULT_LEVEL_COLORS; } - + private void setupPaint() { - mLevel1Color = oneThirdAlphaColor(DEFAULT_COLOR); - mLevel2Color = twoThirdAlphaColor(DEFAULT_COLOR); - mLevel3Color = DEFAULT_COLOR; mPaint.setAntiAlias(true); mPaint.setStrokeWidth(mStrokeWidth); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeCap(Paint.Cap.ROUND); - setInsets((int) mWidth, (int) mHeight); + initStrokeInset((int) mWidth, (int) mHeight); } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas) { int saveCount = canvas.save(); - canvas.rotate(mGroupRotation, bounds.exactCenterX(), bounds.exactCenterY()); - RectF arcBounds = mTempBounds; - arcBounds.set(bounds); - arcBounds.inset(mStrokeInset, mStrokeInset); + mTempBounds.set(mBounds); + mTempBounds.inset(mStrokeInset, mStrokeInset); + canvas.rotate(mGroupRotation, mTempBounds.centerX(), mTempBounds.centerY()); - mPaint.setColor(mLevel1Color); - canvas.drawArc(arcBounds, mEndDegrees, mLevel1SwipeDegrees, false, mPaint); - mPaint.setColor(mLevel2Color); - canvas.drawArc(arcBounds, mEndDegrees, mLevel2SwipeDegrees, false, mPaint); - mPaint.setColor(mLevel3Color); - canvas.drawArc(arcBounds, mEndDegrees, mLevel3SwipeDegrees, false, mPaint); + for (int i = 0; i < 3; i++) { + if (mLevelSwipeDegrees[i] != 0) { + mPaint.setColor(mLevelColors[i]); + canvas.drawArc(mTempBounds, mEndDegrees, mLevelSwipeDegrees[i], false, mPaint); + } + } canvas.restoreToCount(saveCount); } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { // Moving the start trim only occurs in the first 50% of a // single ring animation if (renderProgress <= START_TRIM_DURATION_OFFSET) { float startTrimProgress = (renderProgress) / START_TRIM_DURATION_OFFSET; mStartDegrees = mOriginStartDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress); - float mSwipeDegrees = MIN_SWIPE_DEGREE; - if (Math.abs(mEndDegrees - mStartDegrees) > MIN_SWIPE_DEGREE) { - mSwipeDegrees = mEndDegrees - mStartDegrees; - } + float mSwipeDegrees = mEndDegrees - mStartDegrees; float levelSwipeDegreesProgress = Math.abs(mSwipeDegrees) / MAX_SWIPE_DEGREES; float level1Increment = DECELERATE_INTERPOLATOR.getInterpolation(levelSwipeDegreesProgress) - LINEAR_INTERPOLATOR.getInterpolation(levelSwipeDegreesProgress); float level3Increment = ACCELERATE_INTERPOLATOR.getInterpolation(levelSwipeDegreesProgress) - LINEAR_INTERPOLATOR.getInterpolation(levelSwipeDegreesProgress); - mLevel1SwipeDegrees = -mSwipeDegrees * (1 + level1Increment); - mLevel2SwipeDegrees = -mSwipeDegrees * LEVEL2_SWEEP_ANGLE_OFFSET; - mLevel3SwipeDegrees = -mSwipeDegrees * LEVEL3_SWEEP_ANGLE_OFFSET * (1 + level3Increment); + mLevelSwipeDegrees[0] = -mSwipeDegrees * LEVEL_SWEEP_ANGLE_OFFSETS[0] * (1.0f + level1Increment); + mLevelSwipeDegrees[1] = -mSwipeDegrees * LEVEL_SWEEP_ANGLE_OFFSETS[1] * 1.0f; + mLevelSwipeDegrees[2] = -mSwipeDegrees * LEVEL_SWEEP_ANGLE_OFFSETS[2] * (1.0f + level3Increment); } // Moving the end trim starts after 50% of a single ring @@ -158,24 +151,21 @@ public void computeRender(float renderProgress) { float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET); mEndDegrees = mOriginEndDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(endTrimProgress); - float mSwipeDegrees = MIN_SWIPE_DEGREE; - if (Math.abs(mEndDegrees - mStartDegrees) > MIN_SWIPE_DEGREE) { - mSwipeDegrees = mEndDegrees - mStartDegrees; - } + float mSwipeDegrees = mEndDegrees - mStartDegrees; float levelSwipeDegreesProgress = Math.abs(mSwipeDegrees) / MAX_SWIPE_DEGREES; - if (levelSwipeDegreesProgress > LEVEL2_SWEEP_ANGLE_OFFSET) { - mLevel1SwipeDegrees = -mSwipeDegrees; - mLevel2SwipeDegrees = MAX_SWIPE_DEGREES * LEVEL2_SWEEP_ANGLE_OFFSET; - mLevel3SwipeDegrees = MAX_SWIPE_DEGREES * LEVEL3_SWEEP_ANGLE_OFFSET; - } else if (levelSwipeDegreesProgress > LEVEL3_SWEEP_ANGLE_OFFSET) { - mLevel1SwipeDegrees = MIN_SWIPE_DEGREE; - mLevel2SwipeDegrees = -mSwipeDegrees; - mLevel3SwipeDegrees = MAX_SWIPE_DEGREES * LEVEL3_SWEEP_ANGLE_OFFSET; + if (levelSwipeDegreesProgress > LEVEL_SWEEP_ANGLE_OFFSETS[1]) { + mLevelSwipeDegrees[0] = -mSwipeDegrees; + mLevelSwipeDegrees[1] = MAX_SWIPE_DEGREES * LEVEL_SWEEP_ANGLE_OFFSETS[1]; + mLevelSwipeDegrees[2] = MAX_SWIPE_DEGREES * LEVEL_SWEEP_ANGLE_OFFSETS[2]; + } else if (levelSwipeDegreesProgress > LEVEL_SWEEP_ANGLE_OFFSETS[2]) { + mLevelSwipeDegrees[0] = 0; + mLevelSwipeDegrees[1] = -mSwipeDegrees; + mLevelSwipeDegrees[2] = MAX_SWIPE_DEGREES * LEVEL_SWEEP_ANGLE_OFFSETS[2]; } else { - mLevel1SwipeDegrees = MIN_SWIPE_DEGREE; - mLevel2SwipeDegrees = MIN_SWIPE_DEGREE; - mLevel3SwipeDegrees = -mSwipeDegrees; + mLevelSwipeDegrees[0] = 0; + mLevelSwipeDegrees[1] = 0; + mLevelSwipeDegrees[2] = -mSwipeDegrees; } } @@ -184,37 +174,25 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); - } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - } @Override - public void reset() { + protected void reset() { resetOriginals(); } - public void setColor(int color) { - mLevel1Color = oneThirdAlphaColor(color); - mLevel2Color = twoThirdAlphaColor(color); - mLevel3Color = color; - } - - public void setInsets(int width, int height) { - final float minEdge = (float) Math.min(width, height); - float insets; - if (mCenterRadius <= 0 || minEdge < 0) { - insets = (float) Math.ceil(mStrokeWidth / 2.0f); - } else { - insets = minEdge / 2.0f - mCenterRadius; - } - mStrokeInset = insets; + 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() { @@ -232,32 +210,90 @@ private void resetOriginals() { mStartDegrees = 0; mRotationIncrement = 0; - mLevel1SwipeDegrees = MIN_SWIPE_DEGREE; - mLevel2SwipeDegrees = MIN_SWIPE_DEGREE; - mLevel3SwipeDegrees = MIN_SWIPE_DEGREE; + mLevelSwipeDegrees[0] = 0; + mLevelSwipeDegrees[1] = 0; + mLevelSwipeDegrees[2] = 0; } - private int oneThirdAlphaColor(int colorValue) { - int startA = (colorValue >> 24) & 0xff; - int startR = (colorValue >> 16) & 0xff; - int startG = (colorValue >> 8) & 0xff; - int startB = colorValue & 0xff; + 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.mLevelColors = builder.mLevelColors != null ? builder.mLevelColors : this.mLevelColors; - return (startA / 3 << 24) - | (startR << 16) - | (startG << 8) - | startB; + setupPaint(); + initStrokeInset(this.mWidth, this.mHeight); } - private int twoThirdAlphaColor(int colorValue) { - int startA = (colorValue >> 24) & 0xff; - int startR = (colorValue >> 16) & 0xff; - int startG = (colorValue >> 8) & 0xff; - int startB = colorValue & 0xff; + public static class Builder { + private Context mContext; + + private int mWidth; + private int mHeight; + private int mStrokeWidth; + private int mCenterRadius; + + @Size(3) + private int[] mLevelColors; + + 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; + } - return (startA * 2 / 3 << 24) - | (startR << 16) - | (startG << 8) - | startB; + public Builder setCenterRadius(int centerRadius) { + this.mCenterRadius = centerRadius; + return this; + } + + public Builder setLevelColors(@Size(3) int[] colors) { + this.mLevelColors = colors; + return this; + } + + public Builder setLevelColor(int color) { + return setLevelColors(new int[]{oneThirdAlphaColor(color), twoThirdAlphaColor(color), color}); + } + + public LevelLoadingRenderer build() { + LevelLoadingRenderer loadingRenderer = new LevelLoadingRenderer(mContext); + loadingRenderer.apply(this); + return loadingRenderer; + } + + private int oneThirdAlphaColor(int colorValue) { + int startA = (colorValue >> 24) & 0xff; + int startR = (colorValue >> 16) & 0xff; + int startG = (colorValue >> 8) & 0xff; + int startB = colorValue & 0xff; + + return (startA / 3 << 24) | (startR << 16) | (startG << 8) | startB; + } + + private int twoThirdAlphaColor(int colorValue) { + int startA = (colorValue >> 24) & 0xff; + int startR = (colorValue >> 16) & 0xff; + int startG = (colorValue >> 8) & 0xff; + int startB = colorValue & 0xff; + + return (startA * 2 / 3 << 24) | (startR << 16) | (startG << 8) | startB; + } } + } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java index 99ec464..eff0c5b 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java @@ -7,11 +7,8 @@ import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; -import android.graphics.Rect; import android.graphics.RectF; -import android.support.annotation.NonNull; import android.support.v4.view.animation.FastOutSlowInInterpolator; -import android.util.DisplayMetrics; import android.view.animation.Interpolator; import app.dinus.com.loadingdrawable.DensityUtil; @@ -23,7 +20,6 @@ public class MaterialLoadingRenderer extends LoadingRenderer { private static final int DEGREE_360 = 360; private static final int NUM_POINTS = 5; - private static final float MIN_SWIPE_DEGREE = 0.1f; private static final float MAX_SWIPE_DEGREES = 0.8f * DEGREE_360; private static final float FULL_GROUP_ROTATION = 3.0f * DEGREE_360; private static final float MAX_ROTATION_INCREMENT = 0.25f * DEGREE_360; @@ -31,7 +27,7 @@ public class MaterialLoadingRenderer extends LoadingRenderer { private static final float COLOR_START_DELAY_OFFSET = 0.8f; private static final float END_TRIM_DURATION_OFFSET = 1.0f; private static final float START_TRIM_DURATION_OFFSET = 0.5f; - + private static final float DEFAULT_CENTER_RADIUS = 12.5f; private static final float DEFAULT_STROKE_WIDTH = 2.5f; @@ -80,7 +76,7 @@ public void onAnimationStart(Animator animation) { private float mStrokeWidth; private float mCenterRadius; - public MaterialLoadingRenderer(Context context) { + private MaterialLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -94,7 +90,7 @@ private void init(Context context) { mColors = DEFAULT_COLORS; setColorIndex(0); - setInsets((int) mWidth, (int) mHeight); + initStrokeInset(mWidth, mHeight); } private void setupPaint() { @@ -105,70 +101,68 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas) { int saveCount = canvas.save(); - canvas.rotate(mGroupRotation, bounds.exactCenterX(), bounds.exactCenterY()); + mTempBounds.set(mBounds); + mTempBounds.inset(mStrokeInset, mStrokeInset); - RectF arcBounds = mTempBounds; - arcBounds.set(bounds); - arcBounds.inset(mStrokeInset, mStrokeInset); + canvas.rotate(mGroupRotation, mTempBounds.centerX(), mTempBounds.centerY()); - mPaint.setColor(mCurrentColor); - canvas.drawArc(arcBounds, mStartDegrees, mSwipeDegrees, false, mPaint); + if (mSwipeDegrees != 0) { + mPaint.setColor(mCurrentColor); + canvas.drawArc(mTempBounds, mStartDegrees, mSwipeDegrees, false, mPaint); + } canvas.restoreToCount(saveCount); } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { updateRingColor(renderProgress); // Moving the start trim only occurs in the first 50% of a // single ring animation if (renderProgress <= START_TRIM_DURATION_OFFSET) { float startTrimProgress = renderProgress / START_TRIM_DURATION_OFFSET; - mStartDegrees = mOriginStartDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress); + mStartDegrees = mOriginStartDegrees + MAX_SWIPE_DEGREES + * MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress); } // Moving the end trim starts after 50% of a single ring // animation completes if (renderProgress > START_TRIM_DURATION_OFFSET) { - float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET); - mEndDegrees = mOriginEndDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(endTrimProgress); + float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET) + / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET); + mEndDegrees = mOriginEndDegrees + MAX_SWIPE_DEGREES + * MATERIAL_INTERPOLATOR.getInterpolation(endTrimProgress); } - if (Math.abs(mEndDegrees - mStartDegrees) > MIN_SWIPE_DEGREE) { + if (Math.abs(mEndDegrees - mStartDegrees) > 0) { mSwipeDegrees = mEndDegrees - mStartDegrees; } - mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS)); + mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) + + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS)); mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * renderProgress); } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); - } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - } @Override - public void reset() { + protected void reset() { resetOriginals(); } - public void setColors(@NonNull int[] colors) { - mColors = colors; - setColorIndex(0); - } - - public void setColorIndex(int index) { + private void setColorIndex(int index) { mColorIndex = index; mCurrentColor = mColors[mColorIndex]; } @@ -185,15 +179,11 @@ private void goToNextColor() { setColorIndex(getNextColorIndex()); } - private void setInsets(int width, int height) { - final float minEdge = (float) Math.min(width, height); - float insets; - if (mCenterRadius <= 0 || minEdge < 0) { - insets = (float) Math.ceil(mStrokeWidth / 2.0f); - } else { - insets = minEdge / 2.0f - mCenterRadius; - } - mStrokeInset = insets; + 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() { @@ -210,8 +200,6 @@ private void resetOriginals() { mEndDegrees = 0; mStartDegrees = 0; mRotationIncrement = 0; - - mSwipeDegrees = MIN_SWIPE_DEGREE; } private int getStartingColor() { @@ -241,4 +229,63 @@ private int evaluateColorChange(float fraction, int startValue, int endValue) { | ((startG + (int) (fraction * (endG - startG))) << 8) | ((startB + (int) (fraction * (endB - startB)))); } + + 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.mColors = builder.mColors != null && builder.mColors.length > 0 ? builder.mColors : this.mColors; + + setColorIndex(0); + 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[] mColors; + + 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 setColors(int[] colors) { + this.mColors = colors; + return this; + } + + public MaterialLoadingRenderer build() { + MaterialLoadingRenderer loadingRenderer = new MaterialLoadingRenderer(mContext); + loadingRenderer.apply(this); + return loadingRenderer; + } + } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java index 1929ce7..9d281f8 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java @@ -76,7 +76,7 @@ public void onAnimationStart(Animator animation) { private float mStrokeWidth; private float mCenterRadius; - public WhorlLoadingRenderer(Context context) { + private WhorlLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -98,7 +98,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); canvas.rotate(mGroupRotation, bounds.exactCenterX(), bounds.exactCenterY()); @@ -134,7 +134,7 @@ private RectF createArcBounds(RectF sourceArcBounds, int index) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { // Moving the start trim only occurs in the first 50% of a // single ring animation if (renderProgress <= START_TRIM_DURATION_OFFSET) { @@ -158,27 +158,23 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override - public void reset() { + protected void reset() { resetOriginals(); } - public void setColors(@NonNull int[] colors) { - mColors = colors; - } - - public void setInsets(int width, int height) { + private void setInsets(int width, int height) { final float minEdge = (float) Math.min(width, height); float insets; if (mCenterRadius <= 0 || minEdge < 0) { @@ -206,4 +202,17 @@ private void resetOriginals() { mSwipeDegrees = MIN_SWIPE_DEGREE; } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public WhorlLoadingRenderer build() { + WhorlLoadingRenderer loadingRenderer = new WhorlLoadingRenderer(mContext); + return loadingRenderer; + } + } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/BalloonLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/BalloonLoadingRenderer.java index 474a632..269ecac 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/BalloonLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/BalloonLoadingRenderer.java @@ -78,7 +78,7 @@ public class BalloonLoadingRenderer extends LoadingRenderer { private int mCannulaColor; private int mPipeBodyColor; - public BalloonLoadingRenderer(Context context) { + private BalloonLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -119,7 +119,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); RectF arcBounds = mCurrentBounds; @@ -160,7 +160,7 @@ public void draw(Canvas canvas, Rect bounds) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { RectF arcBounds = mCurrentBounds; //compute gas tube bounds mGasTubeBounds.set(arcBounds.centerX() - mGasTubeWidth / 2.0f, arcBounds.centerY(), @@ -282,18 +282,30 @@ private Path createBalloonPath(RectF balloonRect, float progress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - } @Override - public void reset() { + protected void reset() { + } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public BalloonLoadingRenderer build() { + BalloonLoadingRenderer loadingRenderer = new BalloonLoadingRenderer(mContext); + return loadingRenderer; + } } } \ No newline at end of file diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/WaterBottleLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/WaterBottleLoadingRenderer.java index 15084f4..5f86023 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/WaterBottleLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/goods/WaterBottleLoadingRenderer.java @@ -66,7 +66,7 @@ public class WaterBottleLoadingRenderer extends LoadingRenderer { private int mWaveCount; - public WaterBottleLoadingRenderer(Context context) { + private WaterBottleLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -98,7 +98,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); RectF arcBounds = mCurrentBounds; @@ -130,7 +130,7 @@ public void draw(Canvas canvas, Rect bounds) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { if (mCurrentBounds.width() <= 0) { return; } @@ -278,19 +278,19 @@ private float getMaxRiseHeight(float bottleRadius, float waterDropRadius, float } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override - public void reset() { + protected void reset() { } private class WaterDropHolder { @@ -306,4 +306,17 @@ private class WaterDropHolder { public boolean mNeedDraw; } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public WaterBottleLoadingRenderer build() { + WaterBottleLoadingRenderer loadingRenderer = new WaterBottleLoadingRenderer(mContext); + return loadingRenderer; + } + } } \ No newline at end of file diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/DayNightLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/DayNightLoadingRenderer.java index 6bf2592..cf5d319 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/DayNightLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/DayNightLoadingRenderer.java @@ -109,7 +109,7 @@ public void onAnimationRepeat(Animator animator) { private int mSunRayCount; - public DayNightLoadingRenderer(Context context) { + private DayNightLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -152,7 +152,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); RectF arcBounds = mTempBounds; @@ -201,7 +201,7 @@ public void draw(Canvas canvas, Rect bounds) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { if (renderProgress <= SUN_RISE_DURATION_OFFSET) { float sunRiseProgress = renderProgress / SUN_RISE_DURATION_OFFSET; mSunCoordinateY = mInitSun$MoonCoordinateY - mMaxSun$MoonRiseDistance * MATERIAL_INTERPOLATOR.getInterpolation(sunRiseProgress); @@ -273,19 +273,19 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override - public void reset() { + protected void reset() { } private void initStarHolders(RectF currentBounds) { @@ -344,4 +344,17 @@ public StarHolder(float flashOffset, PointF mPoint) { this.mInterpolator = INTERPOLATORS[mRandom.nextInt(INTERPOLATORS.length)]; } } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public DayNightLoadingRenderer build() { + DayNightLoadingRenderer loadingRenderer = new DayNightLoadingRenderer(mContext); + return loadingRenderer; + } + } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/ElectricFanLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/ElectricFanLoadingRenderer.java index d5da07f..63c8fd8 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/ElectricFanLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/scenery/ElectricFanLoadingRenderer.java @@ -120,7 +120,7 @@ public void onAnimationRepeat(Animator animator) { private Drawable mLoadingDrawable; private Drawable mElectricFanDrawable; - public ElectricFanLoadingRenderer(Context context) { + private ElectricFanLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -158,7 +158,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); RectF arcBounds = mTempBounds; @@ -296,7 +296,7 @@ private Path createProgressPath(float progress, float circleRadius, RectF progre } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { if (renderProgress < DECELERATE_DURATION_PERCENTAGE) { mProgress = DECELERATE_INTERPOLATOR.getInterpolation(renderProgress / DECELERATE_DURATION_PERCENTAGE) * DECELERATE_DURATION_PERCENTAGE; } else { @@ -305,26 +305,26 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override - public void reset() { + protected void reset() { mScale = 1.0f; mCurrentLeafCount = 0; mNextLeafCreateThreshold = 0.0f; mLeafHolders.clear(); } - public void setInsets(int width, int height) { + protected void setInsets(int width, int height) { final float minEdge = (float) Math.min(width, height); float insetXs; if (mCenterRadius <= 0 || minEdge < 0) { @@ -395,10 +395,6 @@ private PointF getPoint2(RectF leafFlyRect) { return point; } - public void setMode(@MODE int mode) { - this.mMode = mode; - } - private class BezierEvaluator implements TypeEvaluator { private PointF point1; @@ -461,4 +457,17 @@ private class LeafHolder { public float mMaxRotation = mRandom.nextInt(120); } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public ElectricFanLoadingRenderer build() { + ElectricFanLoadingRenderer loadingRenderer = new ElectricFanLoadingRenderer(mContext); + return loadingRenderer; + } + } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CircleBroodLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CircleBroodLoadingRenderer.java index 8bdc93d..8fb83f1 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CircleBroodLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CircleBroodLoadingRenderer.java @@ -108,7 +108,7 @@ public class CircleBroodLoadingRenderer extends LoadingRenderer { private float mStageChildForwardBottomLeftLength; private float mStageChildBackwardBottomLeftLength; - public CircleBroodLoadingRenderer(Context context) { + private CircleBroodLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -141,7 +141,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); RectF arcBounds = mCurrentBounds; @@ -258,7 +258,7 @@ private Path createLinkPath() { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { if (mCurrentBounds.isEmpty()) { return; } @@ -598,19 +598,19 @@ private float getRestLength(Path path, float startD) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override - public void reset() { + protected void reset() { } private class MotherMoveInterpolator implements Interpolator { @@ -661,4 +661,17 @@ public float getInterpolation(float input) { return result; } } + + public static class Builder { + private Context mContext; + + public Builder(Context mContext) { + this.mContext = mContext; + } + + public CircleBroodLoadingRenderer build() { + CircleBroodLoadingRenderer loadingRenderer = new CircleBroodLoadingRenderer(mContext); + return loadingRenderer; + } + } } \ No newline at end of file diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CoolWaitLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CoolWaitLoadingRenderer.java index 253a8c2..a404e78 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CoolWaitLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/shapechange/CoolWaitLoadingRenderer.java @@ -60,7 +60,7 @@ public class CoolWaitLoadingRenderer extends LoadingRenderer { private int mMiddleColor; private int mBottomColor; - public CoolWaitLoadingRenderer(Context context) { + private CoolWaitLoadingRenderer(Context context) { super(context); init(context); setupPaint(); @@ -88,7 +88,7 @@ private void setupPaint() { } @Override - public void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas, Rect bounds) { int saveCount = canvas.save(); RectF arcBounds = mCurrentBounds; arcBounds.set(bounds); @@ -145,7 +145,7 @@ private Path createWaitPath(RectF bounds) { } @Override - public void computeRender(float renderProgress) { + protected void computeRender(float renderProgress) { if (mCurrentBounds.isEmpty()) { return; } @@ -240,20 +240,31 @@ public void computeRender(float renderProgress) { } @Override - public void setAlpha(int alpha) { + protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override - public void setColorFilter(ColorFilter cf) { + protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override - public void reset() { + protected void reset() { } + public static class Builder { + private Context mContext; + public Builder(Context mContext) { + this.mContext = mContext; + } + + public CoolWaitLoadingRenderer build() { + CoolWaitLoadingRenderer loadingRenderer = new CoolWaitLoadingRenderer(mContext); + return loadingRenderer; + } + } } From 0d47d0bb56d9846bd654442fe2640339effa23b7 Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Thu, 4 Aug 2016 01:03:04 +0800 Subject: [PATCH 03/14] update readme.md --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 687ee39..56680e7 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-LoadingDrawable-brightgreen.svg?style=flat)](http://android-arsenal.com/details/1/3450) LoadingDrawable is some android animations implement of drawable: a library can be used in the pull-down to refresh, the placeholders of image loading and the time-consuming tasks. This project idea is from the [link] (http://mp.weixin.qq.com/s?__biz=MjM5MDMxOTE5NA==&mid=402703079&idx=2&sn=2fcc6746a866dcc003c68ead9b68e595&scene=2&srcid=0302A7p723KK8E5gSzLKb2ZL&from=timeline&isappinstalled=0#wechat_redirect).
+ The following content show a brief overview of LoadingDrawable * It extends `Drawable` and implement the interface `Animatable` @@ -41,20 +42,20 @@ * GhostsEyeLoadingEyeRenderer #### Scenery - * DayNightLoadingRenderer * ElectricFanLoadingRenderer - -#### Circle Rotate - * GearLoadingRenderer - * WhorlLoadingRenderer - * LevelLoadingRenderer - * MaterialLoadingRenderer + * DayNightLoadingRenderer #### Circle Jump + * CollisionLoadingRenderer * SwapLoadingRenderer * GuardLoadingRenderer * DanceLoadingRenderer - * CollisionLoadingRenderer + +#### Circle Rotate + * WhorlLoadingRenderer + * MaterialLoadingRenderer + * GearLoadingRenderer + * LevelLoadingRenderer ## Usage Define the `LoadingView` in XML and specify the `LoadingRenderer` style: From 0a8eff08bc43d6353e007da32d9003e35f69ea21 Mon Sep 17 00:00:00 2001 From: dinus_developer <13836160245@163.com> Date: Thu, 4 Aug 2016 01:08:36 +0800 Subject: [PATCH 04/14] update readme.md --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 56680e7..8c898e5 100644 --- a/README.md +++ b/README.md @@ -7,18 +7,18 @@ LoadingDrawable is some android animations implement of drawable: a library can be used in the pull-down to refresh, the placeholders of image loading and the time-consuming tasks. This project idea is from the [link] (http://mp.weixin.qq.com/s?__biz=MjM5MDMxOTE5NA==&mid=402703079&idx=2&sn=2fcc6746a866dcc003c68ead9b68e595&scene=2&srcid=0302A7p723KK8E5gSzLKb2ZL&from=timeline&isappinstalled=0#wechat_redirect).
- The following content show a brief overview of LoadingDrawable +The following content show a brief overview of LoadingDrawable + +* It extends `Drawable` and implement the interface `Animatable` +* it uses strategy mode +* It can be used as the background of View or content of `ImageView` +* It's constructor must be passed a `LoadingRenderer` +* It interact with `LoadingRenderer` by the callback `Callback` +* `LoadingRenderer` is used for measuring and drawing the `LoadingDrawable`. note: +`LoadingRenderer` is the core +* `LoadingRenderer` only can be created by their `Builder`. - * It extends `Drawable` and implement the interface `Animatable` - * it uses strategy mode - * It can be used as the background of View or content of `ImageView` - * It's constructor must be passed a `LoadingRenderer` - * It interact with `LoadingRenderer` by the callback `Callback` - * `LoadingRenderer` is used for measuring and drawing the `LoadingDrawable`. note: - `LoadingRenderer` is the core - * `LoadingRenderer` only can be created by their `Builder`. - - Learn more about LoadingDrawable on the [Wiki Home] (https://github.com/dinuscxj/LoadingDrawable/wiki). +Learn more about LoadingDrawable on the [Wiki Home] (https://github.com/dinuscxj/LoadingDrawable/wiki). ![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/ShapeChangeDrawable.gif) ![](https://raw.githubusercontent.com/dinuscxj/LoadingDrawable/master/Preview/GoodsDrawable.gif) From 8a467db3a61204369c4281ec370ae9414bc4225b Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Fri, 5 Aug 2016 00:21:56 +0800 Subject: [PATCH 05/14] optimize circle roate series code --- .../com/example/CircleRotateActivity.java | 2 + .../circle/rotate/GearLoadingRenderer.java | 114 ++++++++++++------ .../circle/rotate/LevelLoadingRenderer.java | 9 ++ .../rotate/MaterialLoadingRenderer.java | 9 ++ .../circle/rotate/WhorlLoadingRenderer.java | 104 ++++++++++++---- 5 files changed, 176 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java b/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java index 8c23d63..ffd562e 100644 --- a/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java +++ b/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java @@ -9,8 +9,10 @@ import app.dinus.com.loadingdrawable.DensityUtil; import app.dinus.com.loadingdrawable.LoadingView; import app.dinus.com.loadingdrawable.render.LoadingRenderer; +import app.dinus.com.loadingdrawable.render.circle.rotate.GearLoadingRenderer; import app.dinus.com.loadingdrawable.render.circle.rotate.LevelLoadingRenderer; import app.dinus.com.loadingdrawable.render.circle.rotate.MaterialLoadingRenderer; +import app.dinus.com.loadingdrawable.render.circle.rotate.WhorlLoadingRenderer; public class CircleRotateActivity extends AppCompatActivity { public static void startActivity(Context context) { diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java index 4d9f391..b904d82 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java @@ -7,9 +7,7 @@ import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; -import android.graphics.Rect; import android.graphics.RectF; -import android.util.DisplayMetrics; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; @@ -28,10 +26,8 @@ public class GearLoadingRenderer extends LoadingRenderer { private static final int MAX_ALPHA = 255; private static final int DEGREE_360 = 360; - private static final float MIN_SWIPE_DEGREE = 0.1f; private static final float MAX_SWIPE_DEGREES = 0.17f * DEGREE_360; private static final float FULL_GROUP_ROTATION = 3.0f * DEGREE_360; - private static final float MAX_ROTATION_INCREMENT = 0.25f * DEGREE_360; private static final float START_SCALE_DURATION_OFFSET = 0.3f; private static final float START_TRIM_DURATION_OFFSET = 0.5f; @@ -63,7 +59,7 @@ public void onAnimationStart(Animator animation) { } }; - private int mCurrentColor; + private int mColor; private float mStrokeInset; @@ -74,10 +70,8 @@ public void onAnimationStart(Animator animation) { private float mEndDegrees; private float mStartDegrees; private float mSwipeDegrees; - private float mRotationIncrement; private float mOriginEndDegrees; private float mOriginStartDegrees; - private float mOriginRotationIncrement; private float mStrokeWidth; private float mCenterRadius; @@ -94,7 +88,7 @@ private void init(Context context) { mStrokeWidth = DensityUtil.dip2px(context, DEFAULT_STROKE_WIDTH); mCenterRadius = DensityUtil.dip2px(context, DEFAULT_CENTER_RADIUS); - mCurrentColor = DEFAULT_COLOR; + mColor = DEFAULT_COLOR; } private void setupPaint() { @@ -103,25 +97,27 @@ private void setupPaint() { mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeCap(Paint.Cap.ROUND); - setInsets((int) mWidth, (int) mHeight); + initStrokeInset(mWidth, mHeight); } @Override - protected void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas) { int saveCount = canvas.save(); - canvas.rotate(mGroupRotation, bounds.exactCenterX(), bounds.exactCenterY()); - RectF arcBounds = mTempBounds; - arcBounds.set(bounds); - arcBounds.inset(mStrokeInset, mStrokeInset); + mTempBounds.set(mBounds); + mTempBounds.inset(mStrokeInset, mStrokeInset); + mTempBounds.inset(mTempBounds.width() * (1.0f - mScale) / 2.0f, mTempBounds.width() * (1.0f - mScale) / 2.0f); - arcBounds.inset(arcBounds.width() * (1.0f - mScale) / 2.0f, arcBounds.width() * (1.0f - mScale) / 2.0f); + canvas.rotate(mGroupRotation, mTempBounds.centerX(), mTempBounds.centerY()); - mPaint.setColor(mCurrentColor); + mPaint.setColor(mColor); mPaint.setAlpha((int) (MAX_ALPHA * mScale)); mPaint.setStrokeWidth(mStrokeWidth * mScale); - for (int i = 0; i < GEAR_COUNT; i++) { - canvas.drawArc(arcBounds, mStartDegrees + DEGREE_360 / GEAR_COUNT * i, mSwipeDegrees, false, mPaint); + + if (mSwipeDegrees != 0) { + for (int i = 0; i < GEAR_COUNT; i++) { + canvas.drawArc(mTempBounds, mStartDegrees + DEGREE_360 / GEAR_COUNT * i, mSwipeDegrees, false, mPaint); + } } canvas.restoreToCount(saveCount); @@ -157,14 +153,13 @@ protected void computeRender(float renderProgress) { mScale = 1.0f - ACCELERATE_INTERPOLATOR.getInterpolation(endScaleProgress); } - if (Math.abs(mEndDegrees - mStartDegrees) > MIN_SWIPE_DEGREE) { - mSwipeDegrees = mEndDegrees - mStartDegrees; - } - 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)); - mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * rotateProgress); + } + + if (Math.abs(mEndDegrees - mStartDegrees) > 0) { + mSwipeDegrees = mEndDegrees - mStartDegrees; } } @@ -183,44 +178,91 @@ protected void reset() { resetOriginals(); } - private void setInsets(int width, int height) { - final float minEdge = (float) Math.min(width, height); - float insets; - if (mCenterRadius <= 0 || minEdge < 0) { - insets = (float) Math.ceil(mStrokeWidth / 2.0f); - } else { - insets = minEdge / 2.0f - mCenterRadius; - } - mStrokeInset = insets; + 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 = mStartDegrees; - mOriginRotationIncrement = mRotationIncrement; } private void resetOriginals() { mOriginEndDegrees = 0; mOriginStartDegrees = 0; - mOriginRotationIncrement = 0; mEndDegrees = 0; mStartDegrees = 0; - mRotationIncrement = 0; - mSwipeDegrees = MIN_SWIPE_DEGREE; + mSwipeDegrees = 0; + } + + 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; + + 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; + 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 GearLoadingRenderer build() { GearLoadingRenderer loadingRenderer = new GearLoadingRenderer(mContext); + loadingRenderer.apply(this); return loadingRenderer; } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java index a09ecf6..4cb42e4 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java @@ -221,6 +221,8 @@ private void apply(Builder builder) { 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.mLevelColors = builder.mLevelColors != null ? builder.mLevelColors : this.mLevelColors; setupPaint(); @@ -235,6 +237,8 @@ public static class Builder { private int mStrokeWidth; private int mCenterRadius; + private int mDuration; + @Size(3) private int[] mLevelColors; @@ -262,6 +266,11 @@ public Builder setCenterRadius(int centerRadius) { return this; } + public Builder setDuration(int duration) { + this.mDuration = duration; + return this; + } + public Builder setLevelColors(@Size(3) int[] colors) { this.mLevelColors = colors; return this; diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java index eff0c5b..44cd1ab 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java @@ -236,6 +236,8 @@ private void apply(Builder builder) { 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.mColors = builder.mColors != null && builder.mColors.length > 0 ? builder.mColors : this.mColors; setColorIndex(0); @@ -251,6 +253,8 @@ public static class Builder { private int mStrokeWidth; private int mCenterRadius; + private int mDuration; + private int[] mColors; public Builder(Context mContext) { @@ -277,6 +281,11 @@ public Builder setCenterRadius(int centerRadius) { return this; } + public Builder setDuration(int duration) { + this.mDuration = duration; + return this; + } + public Builder setColors(int[] colors) { this.mColors = colors; return this; diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java index 9d281f8..d17e616 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java @@ -23,7 +23,6 @@ public class WhorlLoadingRenderer extends LoadingRenderer { private static final int DEGREE_360 = 360; private static final int NUM_POINTS = 5; - private static final float MIN_SWIPE_DEGREE = 0.1f; private static final float MAX_SWIPE_DEGREES = 0.6f * DEGREE_360; private static final float FULL_GROUP_ROTATION = 3.0f * DEGREE_360; private static final float MAX_ROTATION_INCREMENT = 0.25f * DEGREE_360; @@ -40,6 +39,7 @@ public class WhorlLoadingRenderer extends LoadingRenderer { private final Paint mPaint = new Paint(); private final RectF mTempBounds = new RectF(); + private final RectF mTempArcBounds = new RectF(); private final Animator.AnimatorListener mAnimatorListener = new AnimatorListenerAdapter() { @Override @@ -87,7 +87,8 @@ private void init(Context context) { mColors = DEFAULT_COLORS; mStrokeWidth = DensityUtil.dip2px(context, DEFAULT_STROKE_WIDTH); mCenterRadius = DensityUtil.dip2px(context, DEFAULT_CENTER_RADIUS); - setInsets((int) mWidth, (int) mHeight); + + initStrokeInset(mWidth, mHeight); } private void setupPaint() { @@ -98,26 +99,27 @@ private void setupPaint() { } @Override - protected void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas) { int saveCount = canvas.save(); - canvas.rotate(mGroupRotation, bounds.exactCenterX(), bounds.exactCenterY()); - RectF arcBounds = mTempBounds; - arcBounds.set(bounds); - arcBounds.inset(mStrokeInset, mStrokeInset); + mTempBounds.set(mBounds); + mTempBounds.inset(mStrokeInset, mStrokeInset); + + canvas.rotate(mGroupRotation, mTempBounds.centerX(), mTempBounds.centerY()); - for (int i = 0; i < mColors.length; i++) { - mPaint.setStrokeWidth(mStrokeWidth / (i + 1)); - mPaint.setColor(mColors[i]); - canvas.drawArc(createArcBounds(arcBounds, i), mStartDegrees + DEGREE_180 * (i % 2), - mSwipeDegrees, false, mPaint); + if (mSwipeDegrees != 0) { + for (int i = 0; i < mColors.length; i++) { + mPaint.setStrokeWidth(mStrokeWidth / (i + 1)); + mPaint.setColor(mColors[i]); + canvas.drawArc(createArcBounds(mTempBounds, i), mStartDegrees + DEGREE_180 * (i % 2), + mSwipeDegrees, false, mPaint); + } } canvas.restoreToCount(saveCount); } private RectF createArcBounds(RectF sourceArcBounds, int index) { - RectF arcBounds = new RectF(); int intervalWidth = 0; for (int i = 0; i < index; i++) { @@ -128,9 +130,9 @@ private RectF createArcBounds(RectF sourceArcBounds, int index) { int arcBoundsTop = (int) (sourceArcBounds.top + intervalWidth); int arcBoundsRight = (int) (sourceArcBounds.right - intervalWidth); int arcBoundsBottom = (int) (sourceArcBounds.bottom - intervalWidth); - arcBounds.set(arcBoundsLeft, arcBoundsTop, arcBoundsRight, arcBoundsBottom); + mTempArcBounds.set(arcBoundsLeft, arcBoundsTop, arcBoundsRight, arcBoundsBottom); - return arcBounds; + return mTempArcBounds; } @Override @@ -149,7 +151,7 @@ protected void computeRender(float renderProgress) { mEndDegrees = mOriginEndDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(endTrimProgress); } - if (Math.abs(mEndDegrees - mStartDegrees) > MIN_SWIPE_DEGREE) { + if (Math.abs(mEndDegrees - mStartDegrees) > 0) { mSwipeDegrees = mEndDegrees - mStartDegrees; } @@ -174,15 +176,11 @@ protected void reset() { resetOriginals(); } - private void setInsets(int width, int height) { - final float minEdge = (float) Math.min(width, height); - float insets; - if (mCenterRadius <= 0 || minEdge < 0) { - insets = (float) Math.ceil(mStrokeWidth / 2.0f); - } else { - insets = minEdge / 2.0f - mCenterRadius; - } - mStrokeInset = insets; + 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() { @@ -200,18 +198,72 @@ private void resetOriginals() { mStartDegrees = 0; mRotationIncrement = 0; - mSwipeDegrees = MIN_SWIPE_DEGREE; + mSwipeDegrees = 0; + } + + 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.mColors = builder.mColors != null && builder.mColors.length > 0 ? builder.mColors : this.mColors; + + 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[] mColors; + 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 setColors(int[] colors) { + this.mColors = colors; + return this; + } + public WhorlLoadingRenderer build() { WhorlLoadingRenderer loadingRenderer = new WhorlLoadingRenderer(mContext); + loadingRenderer.apply(this); return loadingRenderer; } } From 7798569c47202c5afcacdb1e445aab32b8e522a7 Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Fri, 5 Aug 2016 23:53:59 +0800 Subject: [PATCH 06/14] optimize circle rotate series code --- .../com/example/CircleRotateActivity.java | 9 ++++ .../circle/rotate/GearLoadingRenderer.java | 42 +++++++++++++++---- .../circle/rotate/LevelLoadingRenderer.java | 8 +--- .../rotate/MaterialLoadingRenderer.java | 8 +--- .../circle/rotate/WhorlLoadingRenderer.java | 10 +---- 5 files changed, 46 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java b/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java index ffd562e..8afdcb1 100644 --- a/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java +++ b/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java @@ -24,5 +24,14 @@ public static void startActivity(Context context) { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_circle_rotate); + + LoadingView loadingView = (LoadingView) findViewById(R.id.gear_view); + + LoadingRenderer loadingRenderer = new GearLoadingRenderer.Builder(this) + .setColor(Color.BLUE) + .setGearCount(3) + .setGearSwipeDegrees(100) + .build(); + loadingView.setLoadingRenderer(loadingRenderer); } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java index b904d82..8ad3ed4 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java @@ -8,16 +8,15 @@ import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.RectF; +import android.support.annotation.IntRange; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; -import android.view.animation.LinearInterpolator; import app.dinus.com.loadingdrawable.DensityUtil; import app.dinus.com.loadingdrawable.render.LoadingRenderer; public class GearLoadingRenderer extends LoadingRenderer { - private static final Interpolator LINEAR_INTERPOLATOR = new LinearInterpolator(); private static final Interpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator(); private static final Interpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator(); @@ -26,7 +25,8 @@ public class GearLoadingRenderer extends LoadingRenderer { private static final int MAX_ALPHA = 255; private static final int DEGREE_360 = 360; - private static final float MAX_SWIPE_DEGREES = 0.17f * DEGREE_360; + private static final int DEFAULT_GEAR_SWIPE_DEGREES = 60; + private static final float FULL_GROUP_ROTATION = 3.0f * DEGREE_360; private static final float START_SCALE_DURATION_OFFSET = 0.3f; @@ -61,6 +61,9 @@ public void onAnimationStart(Animator animation) { private int mColor; + private int mGearCount; + private int mGearSwipeDegrees; + private float mStrokeInset; private float mRotationCount; @@ -82,6 +85,8 @@ private GearLoadingRenderer(Context context) { init(context); setupPaint(); addRenderListener(mAnimatorListener); + + mDuration = 10000; } private void init(Context context) { @@ -89,6 +94,9 @@ private void init(Context context) { mCenterRadius = DensityUtil.dip2px(context, DEFAULT_CENTER_RADIUS); mColor = DEFAULT_COLOR; + + mGearCount = GEAR_COUNT; + mGearSwipeDegrees = DEFAULT_GEAR_SWIPE_DEGREES; } private void setupPaint() { @@ -115,8 +123,8 @@ protected void draw(Canvas canvas) { mPaint.setStrokeWidth(mStrokeWidth * mScale); if (mSwipeDegrees != 0) { - for (int i = 0; i < GEAR_COUNT; i++) { - canvas.drawArc(mTempBounds, mStartDegrees + DEGREE_360 / GEAR_COUNT * i, mSwipeDegrees, false, mPaint); + for (int i = 0; i < mGearCount; i++) { + canvas.drawArc(mTempBounds, mStartDegrees + DEGREE_360 / mGearCount * i, mSwipeDegrees, false, mPaint); } } @@ -136,14 +144,14 @@ protected void computeRender(float renderProgress) { // 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 + MAX_SWIPE_DEGREES * LINEAR_INTERPOLATOR.getInterpolation(startTrimProgress); + mStartDegrees = mOriginStartDegrees + mGearSwipeDegrees * startTrimProgress; } // Moving the end trim starts between 50% to 80% of a single ring // animation completes 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 + MAX_SWIPE_DEGREES * LINEAR_INTERPOLATOR.getInterpolation(endTrimProgress); + mEndDegrees = mOriginEndDegrees + mGearSwipeDegrees * endTrimProgress; } // Scaling down the end size starts after 80% of a single ring @@ -187,7 +195,7 @@ private void initStrokeInset(float width, float height) { private void storeOriginals() { mOriginEndDegrees = mEndDegrees; - mOriginStartDegrees = mStartDegrees; + mOriginStartDegrees = mEndDegrees; } private void resetOriginals() { @@ -197,7 +205,7 @@ private void resetOriginals() { mEndDegrees = 0; mStartDegrees = 0; - mSwipeDegrees = 0; + mSwipeDegrees = 1; } private void apply(Builder builder) { @@ -210,6 +218,9 @@ private void apply(Builder builder) { 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); } @@ -226,6 +237,9 @@ public static class Builder { private int mColor; + private int mGearCount; + private int mGearSwipeDegrees; + public Builder(Context mContext) { this.mContext = mContext; } @@ -260,6 +274,16 @@ public Builder setColor(int 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); diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java index 4cb42e4..f0017ee 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java @@ -75,10 +75,8 @@ public void onAnimationStart(Animator animation) { private float mEndDegrees; private float mStartDegrees; - private float mRotationIncrement; private float mOriginEndDegrees; private float mOriginStartDegrees; - private float mOriginRotationIncrement; private float mStrokeWidth; private float mCenterRadius; @@ -170,7 +168,6 @@ protected void computeRender(float renderProgress) { } mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS)); - mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * renderProgress); } @Override @@ -197,18 +194,15 @@ private void initStrokeInset(float width, float height) { private void storeOriginals() { mOriginEndDegrees = mEndDegrees; - mOriginStartDegrees = mStartDegrees; - mOriginRotationIncrement = mRotationIncrement; + mOriginStartDegrees = mEndDegrees; } private void resetOriginals() { mOriginEndDegrees = 0; mOriginStartDegrees = 0; - mOriginRotationIncrement = 0; mEndDegrees = 0; mStartDegrees = 0; - mRotationIncrement = 0; mLevelSwipeDegrees[0] = 0; mLevelSwipeDegrees[1] = 0; diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java index 44cd1ab..83cf4aa 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java @@ -68,10 +68,8 @@ public void onAnimationStart(Animator animation) { private float mEndDegrees; private float mStartDegrees; private float mSwipeDegrees; - private float mRotationIncrement; private float mOriginEndDegrees; private float mOriginStartDegrees; - private float mOriginRotationIncrement; private float mStrokeWidth; private float mCenterRadius; @@ -144,7 +142,6 @@ protected void computeRender(float renderProgress) { mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS)); - mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * renderProgress); } @Override @@ -188,18 +185,15 @@ private void initStrokeInset(float width, float height) { private void storeOriginals() { mOriginEndDegrees = mEndDegrees; - mOriginStartDegrees = mStartDegrees; - mOriginRotationIncrement = mRotationIncrement; + mOriginStartDegrees = mEndDegrees; } private void resetOriginals() { mOriginEndDegrees = 0; mOriginStartDegrees = 0; - mOriginRotationIncrement = 0; mEndDegrees = 0; mStartDegrees = 0; - mRotationIncrement = 0; } private int getStartingColor() { diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java index d17e616..dbd3453 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java @@ -68,11 +68,9 @@ public void onAnimationStart(Animator animation) { private float mEndDegrees; private float mStartDegrees; private float mSwipeDegrees; - private float mRotationIncrement; private float mOriginEndDegrees; private float mOriginStartDegrees; - private float mOriginRotationIncrement; - + private float mStrokeWidth; private float mCenterRadius; @@ -156,7 +154,6 @@ protected void computeRender(float renderProgress) { } mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS)); - mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * renderProgress); } @Override @@ -185,18 +182,15 @@ private void initStrokeInset(float width, float height) { private void storeOriginals() { mOriginEndDegrees = mEndDegrees; - mOriginStartDegrees = mStartDegrees; - mOriginRotationIncrement = mRotationIncrement; + mOriginStartDegrees = mEndDegrees; } private void resetOriginals() { mOriginEndDegrees = 0; mOriginStartDegrees = 0; - mOriginRotationIncrement = 0; mEndDegrees = 0; mStartDegrees = 0; - mRotationIncrement = 0; mSwipeDegrees = 0; } From 872c6bf6fa8bb687ee4038b843df3fc2fe166a7f Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Fri, 5 Aug 2016 23:53:59 +0800 Subject: [PATCH 07/14] optimize circle rotate series code --- .../circle/rotate/GearLoadingRenderer.java | 42 +++++++++++++++---- .../circle/rotate/LevelLoadingRenderer.java | 8 +--- .../rotate/MaterialLoadingRenderer.java | 8 +--- .../circle/rotate/WhorlLoadingRenderer.java | 10 +---- 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java index b904d82..8ad3ed4 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java @@ -8,16 +8,15 @@ import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.RectF; +import android.support.annotation.IntRange; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; -import android.view.animation.LinearInterpolator; import app.dinus.com.loadingdrawable.DensityUtil; import app.dinus.com.loadingdrawable.render.LoadingRenderer; public class GearLoadingRenderer extends LoadingRenderer { - private static final Interpolator LINEAR_INTERPOLATOR = new LinearInterpolator(); private static final Interpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator(); private static final Interpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator(); @@ -26,7 +25,8 @@ public class GearLoadingRenderer extends LoadingRenderer { private static final int MAX_ALPHA = 255; private static final int DEGREE_360 = 360; - private static final float MAX_SWIPE_DEGREES = 0.17f * DEGREE_360; + private static final int DEFAULT_GEAR_SWIPE_DEGREES = 60; + private static final float FULL_GROUP_ROTATION = 3.0f * DEGREE_360; private static final float START_SCALE_DURATION_OFFSET = 0.3f; @@ -61,6 +61,9 @@ public void onAnimationStart(Animator animation) { private int mColor; + private int mGearCount; + private int mGearSwipeDegrees; + private float mStrokeInset; private float mRotationCount; @@ -82,6 +85,8 @@ private GearLoadingRenderer(Context context) { init(context); setupPaint(); addRenderListener(mAnimatorListener); + + mDuration = 10000; } private void init(Context context) { @@ -89,6 +94,9 @@ private void init(Context context) { mCenterRadius = DensityUtil.dip2px(context, DEFAULT_CENTER_RADIUS); mColor = DEFAULT_COLOR; + + mGearCount = GEAR_COUNT; + mGearSwipeDegrees = DEFAULT_GEAR_SWIPE_DEGREES; } private void setupPaint() { @@ -115,8 +123,8 @@ protected void draw(Canvas canvas) { mPaint.setStrokeWidth(mStrokeWidth * mScale); if (mSwipeDegrees != 0) { - for (int i = 0; i < GEAR_COUNT; i++) { - canvas.drawArc(mTempBounds, mStartDegrees + DEGREE_360 / GEAR_COUNT * i, mSwipeDegrees, false, mPaint); + for (int i = 0; i < mGearCount; i++) { + canvas.drawArc(mTempBounds, mStartDegrees + DEGREE_360 / mGearCount * i, mSwipeDegrees, false, mPaint); } } @@ -136,14 +144,14 @@ protected void computeRender(float renderProgress) { // 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 + MAX_SWIPE_DEGREES * LINEAR_INTERPOLATOR.getInterpolation(startTrimProgress); + mStartDegrees = mOriginStartDegrees + mGearSwipeDegrees * startTrimProgress; } // Moving the end trim starts between 50% to 80% of a single ring // animation completes 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 + MAX_SWIPE_DEGREES * LINEAR_INTERPOLATOR.getInterpolation(endTrimProgress); + mEndDegrees = mOriginEndDegrees + mGearSwipeDegrees * endTrimProgress; } // Scaling down the end size starts after 80% of a single ring @@ -187,7 +195,7 @@ private void initStrokeInset(float width, float height) { private void storeOriginals() { mOriginEndDegrees = mEndDegrees; - mOriginStartDegrees = mStartDegrees; + mOriginStartDegrees = mEndDegrees; } private void resetOriginals() { @@ -197,7 +205,7 @@ private void resetOriginals() { mEndDegrees = 0; mStartDegrees = 0; - mSwipeDegrees = 0; + mSwipeDegrees = 1; } private void apply(Builder builder) { @@ -210,6 +218,9 @@ private void apply(Builder builder) { 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); } @@ -226,6 +237,9 @@ public static class Builder { private int mColor; + private int mGearCount; + private int mGearSwipeDegrees; + public Builder(Context mContext) { this.mContext = mContext; } @@ -260,6 +274,16 @@ public Builder setColor(int 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); diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java index 4cb42e4..f0017ee 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java @@ -75,10 +75,8 @@ public void onAnimationStart(Animator animation) { private float mEndDegrees; private float mStartDegrees; - private float mRotationIncrement; private float mOriginEndDegrees; private float mOriginStartDegrees; - private float mOriginRotationIncrement; private float mStrokeWidth; private float mCenterRadius; @@ -170,7 +168,6 @@ protected void computeRender(float renderProgress) { } mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS)); - mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * renderProgress); } @Override @@ -197,18 +194,15 @@ private void initStrokeInset(float width, float height) { private void storeOriginals() { mOriginEndDegrees = mEndDegrees; - mOriginStartDegrees = mStartDegrees; - mOriginRotationIncrement = mRotationIncrement; + mOriginStartDegrees = mEndDegrees; } private void resetOriginals() { mOriginEndDegrees = 0; mOriginStartDegrees = 0; - mOriginRotationIncrement = 0; mEndDegrees = 0; mStartDegrees = 0; - mRotationIncrement = 0; mLevelSwipeDegrees[0] = 0; mLevelSwipeDegrees[1] = 0; diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java index 44cd1ab..83cf4aa 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java @@ -68,10 +68,8 @@ public void onAnimationStart(Animator animation) { private float mEndDegrees; private float mStartDegrees; private float mSwipeDegrees; - private float mRotationIncrement; private float mOriginEndDegrees; private float mOriginStartDegrees; - private float mOriginRotationIncrement; private float mStrokeWidth; private float mCenterRadius; @@ -144,7 +142,6 @@ protected void computeRender(float renderProgress) { mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS)); - mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * renderProgress); } @Override @@ -188,18 +185,15 @@ private void initStrokeInset(float width, float height) { private void storeOriginals() { mOriginEndDegrees = mEndDegrees; - mOriginStartDegrees = mStartDegrees; - mOriginRotationIncrement = mRotationIncrement; + mOriginStartDegrees = mEndDegrees; } private void resetOriginals() { mOriginEndDegrees = 0; mOriginStartDegrees = 0; - mOriginRotationIncrement = 0; mEndDegrees = 0; mStartDegrees = 0; - mRotationIncrement = 0; } private int getStartingColor() { diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java index d17e616..dbd3453 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java @@ -68,11 +68,9 @@ public void onAnimationStart(Animator animation) { private float mEndDegrees; private float mStartDegrees; private float mSwipeDegrees; - private float mRotationIncrement; private float mOriginEndDegrees; private float mOriginStartDegrees; - private float mOriginRotationIncrement; - + private float mStrokeWidth; private float mCenterRadius; @@ -156,7 +154,6 @@ protected void computeRender(float renderProgress) { } mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) + (FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS)); - mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * renderProgress); } @Override @@ -185,18 +182,15 @@ private void initStrokeInset(float width, float height) { private void storeOriginals() { mOriginEndDegrees = mEndDegrees; - mOriginStartDegrees = mStartDegrees; - mOriginRotationIncrement = mRotationIncrement; + mOriginStartDegrees = mEndDegrees; } private void resetOriginals() { mOriginEndDegrees = 0; mOriginStartDegrees = 0; - mOriginRotationIncrement = 0; mEndDegrees = 0; mStartDegrees = 0; - mRotationIncrement = 0; mSwipeDegrees = 0; } From e2acc3eb2a0f13d16e945d4d1dcc07b7e3610f9c Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Fri, 5 Aug 2016 23:58:32 +0800 Subject: [PATCH 08/14] remove test code --- .../java/app/dinus/com/example/CircleRotateActivity.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java b/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java index 8afdcb1..ffd562e 100644 --- a/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java +++ b/app/src/main/java/app/dinus/com/example/CircleRotateActivity.java @@ -24,14 +24,5 @@ public static void startActivity(Context context) { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_circle_rotate); - - LoadingView loadingView = (LoadingView) findViewById(R.id.gear_view); - - LoadingRenderer loadingRenderer = new GearLoadingRenderer.Builder(this) - .setColor(Color.BLUE) - .setGearCount(3) - .setGearSwipeDegrees(100) - .build(); - loadingView.setLoadingRenderer(loadingRenderer); } } From 64c2a974d43b362c7b4d26b40a3e8a4f94d3f6b1 Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Mon, 8 Aug 2016 00:53:33 +0800 Subject: [PATCH 09/14] complete CollisionLoadingRenderer's Builder --- .../dinus/com/example/CircleJumpActivity.java | 7 + .../circle/jump/CollisionLoadingRenderer.java | 229 ++++++++++++------ .../circle/rotate/GearLoadingRenderer.java | 12 +- .../circle/rotate/LevelLoadingRenderer.java | 7 +- .../rotate/MaterialLoadingRenderer.java | 7 +- .../circle/rotate/WhorlLoadingRenderer.java | 7 +- 6 files changed, 171 insertions(+), 98 deletions(-) diff --git a/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java b/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java index bf95c98..77cee01 100644 --- a/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java +++ b/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java @@ -2,8 +2,15 @@ import android.content.Context; import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.ViewUtils; + +import app.dinus.com.loadingdrawable.DensityUtil; +import app.dinus.com.loadingdrawable.LoadingView; +import app.dinus.com.loadingdrawable.render.LoadingRenderer; +import app.dinus.com.loadingdrawable.render.circle.jump.CollisionLoadingRenderer; public class CircleJumpActivity extends AppCompatActivity { public static void startActivity(Context context) { diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java index e41769e..6b4eaff 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java @@ -6,12 +6,9 @@ import android.graphics.ColorFilter; import android.graphics.LinearGradient; import android.graphics.Paint; -import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader; -import android.support.annotation.NonNull; -import android.util.DisplayMetrics; -import android.util.TypedValue; +import android.support.annotation.Size; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; @@ -23,21 +20,18 @@ public class CollisionLoadingRenderer extends LoadingRenderer { private static final Interpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator(); private static final Interpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator(); - private static final int CIRCLE_COUNT = 7; + private static final int DEFAULT_BALL_COUNT = 7; - //the 2 * 2 is the left and right side offset - private static final float DEFAULT_WIDTH = 15.0f * (CIRCLE_COUNT + 2 * 2); - //the 2 * 2 is the top and bottom side offset - private static final float DEFAULT_HEIGHT = 15.0f * (1 + 2 * 2); + private static final float DEFAULT_OVAL_HEIGHT = 1.5f; + private static final float DEFAULT_BALL_RADIUS = 7.5f; + private static final float DEFAULT_WIDTH = 15.0f * 11; + private static final float DEFAULT_HEIGHT = 15.0f * 4; - private static final float DURATION_OFFSET = 0.25f; private static final float START_LEFT_DURATION_OFFSET = 0.25f; private static final float START_RIGHT_DURATION_OFFSET = 0.5f; private static final float END_RIGHT_DURATION_OFFSET = 0.75f; private static final float END_LEFT_DURATION_OFFSET = 1.0f; - private static final float DEFAULT_STROKE_WIDTH = 2.5f; - private static final int[] DEFAULT_COLORS = new int[]{ Color.RED, Color.GREEN }; @@ -47,126 +41,134 @@ public class CollisionLoadingRenderer extends LoadingRenderer { }; private final Paint mPaint = new Paint(); - private final RectF mTempBounds = new RectF(); + private final RectF mOvalRect = new RectF(); + @Size(2) private int[] mColors; private float[] mPositions; private float mEndXOffsetProgress; private float mStartXOffsetProgress; - private float mStrokeWidth; + private float mOvalVerticalRadius; + + private float mBallRadius; + private float mBallCenterY; + private float mSideOffsets; + private float mBallMoveXOffsets; + private float mBallQuadCoefficient; + + private int mBallCount; private CollisionLoadingRenderer(Context context) { super(context); init(context); + adjustParams(); setupPaint(); } private void init(Context context) { + mBallRadius = DensityUtil.dip2px(context, DEFAULT_BALL_RADIUS); mWidth = DensityUtil.dip2px(context, DEFAULT_WIDTH); mHeight = DensityUtil.dip2px(context, DEFAULT_HEIGHT); - mStrokeWidth = DensityUtil.dip2px(context, DEFAULT_STROKE_WIDTH); - } + mOvalVerticalRadius = DensityUtil.dip2px(context, DEFAULT_OVAL_HEIGHT); + + mBallCount = DEFAULT_BALL_COUNT; - private void setupPaint() { mColors = DEFAULT_COLORS; mPositions = DEFAULT_POSITIONS; - mPaint.setStrokeWidth(mStrokeWidth); + //mBallMoveYOffsets = mBallQuadCoefficient * mBallMoveXOffsets ^ 2 + // ==> if mBallMoveYOffsets == mBallMoveXOffsets + // ==> mBallQuadCoefficient = 1.0f / mBallMoveXOffsets; + mBallMoveXOffsets = 1.5f * (2 * mBallRadius); + mBallQuadCoefficient = 1.0f / mBallMoveXOffsets; + } + + private void adjustParams() { + mBallCenterY = mHeight / 2.0f; + mSideOffsets = (mWidth - mBallRadius * 2.0f * (mBallCount - 2)) / 2; + } + + private void setupPaint() { mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.FILL); + + mPaint.setShader(new LinearGradient(mSideOffsets, 0, mWidth - mSideOffsets, 0, + mColors, mPositions, Shader.TileMode.CLAMP)); } @Override - protected void draw(Canvas canvas, Rect bounds) { + protected void draw(Canvas canvas) { int saveCount = canvas.save(); - RectF arcBounds = mTempBounds; - arcBounds.set(bounds); - - float cy = mHeight / 2; - float circleRadius = computeCircleRadius(arcBounds); - - float sideOffset = 2.0f * (2 * circleRadius); - float maxMoveOffset = 1.5f * (2 * circleRadius); - - LinearGradient gradient = new LinearGradient(arcBounds.left + sideOffset, 0, arcBounds.right - sideOffset, 0, - mColors, mPositions, Shader.TileMode.CLAMP); - mPaint.setShader(gradient); - - for (int i = 0; i < CIRCLE_COUNT; i++) { + for (int i = 0; i < mBallCount; i++) { + //yMoveOffset = mBallQuadCoefficient * xMoveOffset ^ 2 if (i == 0 && mStartXOffsetProgress != 0) { - float xMoveOffset = maxMoveOffset * mStartXOffsetProgress; - // y = ax^2 --> if x = sideOffset, y = sideOffset ==> a = 1 / sideOffset - float yMoveOffset = (float) (Math.pow(xMoveOffset, 2) / maxMoveOffset); - canvas.drawCircle(circleRadius + sideOffset - xMoveOffset, cy - yMoveOffset, circleRadius, mPaint); + float xMoveOffset = mBallMoveXOffsets * mStartXOffsetProgress; + float yMoveOffset = (float) (Math.pow(xMoveOffset, 2) * mBallQuadCoefficient); + canvas.drawCircle(mSideOffsets - mBallRadius - xMoveOffset, mBallCenterY - yMoveOffset, mBallRadius, mPaint); + + float leftStartProgress = 1.0f - mStartXOffsetProgress; + mOvalRect.set(mSideOffsets - mBallRadius - mBallRadius * leftStartProgress - xMoveOffset, + mHeight - mOvalVerticalRadius - mOvalVerticalRadius * leftStartProgress, + mSideOffsets - mBallRadius + mBallRadius * leftStartProgress - xMoveOffset, + mHeight - mOvalVerticalRadius + mOvalVerticalRadius * leftStartProgress); + canvas.drawOval(mOvalRect, mPaint); continue; } - if (i == CIRCLE_COUNT - 1 && mEndXOffsetProgress != 0) { - float xMoveOffset = maxMoveOffset * mEndXOffsetProgress; - // y = ax^2 --> if x = sideOffset, y = sideOffset / 2 ==> a = 1 / sideOffset - float yMoveOffset = (float) (Math.pow(xMoveOffset, 2) / maxMoveOffset); - canvas.drawCircle(circleRadius * (CIRCLE_COUNT * 2 - 1) + sideOffset + xMoveOffset, cy - yMoveOffset, circleRadius, mPaint); + if (i == mBallCount - 1 && mEndXOffsetProgress != 0) { + float xMoveOffset = mBallMoveXOffsets * mEndXOffsetProgress; + float yMoveOffset = (float) (Math.pow(xMoveOffset, 2) * mBallQuadCoefficient); + canvas.drawCircle(mBallRadius * (mBallCount * 2 - 3) + mSideOffsets + xMoveOffset, mBallCenterY - yMoveOffset, mBallRadius, mPaint); + + float leftEndProgress = 1.0f - mEndXOffsetProgress; + mOvalRect.set(mBallRadius * (mBallCount * 2 - 3) - mBallRadius * leftEndProgress + mSideOffsets + xMoveOffset, + mHeight - mOvalVerticalRadius - mOvalVerticalRadius * leftEndProgress, + mBallRadius * (mBallCount * 2 - 3) + mBallRadius * leftEndProgress + mSideOffsets + xMoveOffset, + mHeight - mOvalVerticalRadius + mOvalVerticalRadius * leftEndProgress); + canvas.drawOval(mOvalRect, mPaint); continue; } - canvas.drawCircle(circleRadius * (i * 2 + 1) + sideOffset, cy, circleRadius, mPaint); + canvas.drawCircle(mBallRadius * (i * 2 - 1) + mSideOffsets, mBallCenterY, mBallRadius, mPaint); + + mOvalRect.set(mBallRadius * (i * 2 - 2) + mSideOffsets, mHeight - mOvalVerticalRadius * 2, + mBallRadius * (i * 2) + mSideOffsets, mHeight); + canvas.drawOval(mOvalRect, mPaint); } canvas.restoreToCount(saveCount); } - private float computeCircleRadius(RectF rectBounds) { - float width = rectBounds.width(); - float height = rectBounds.height(); - - //CIRCLE_COUNT + 4 is the sliding distance of both sides - float radius = Math.min(width / (CIRCLE_COUNT + 4) / 2, height / 2); - return radius; - } - @Override protected void computeRender(float renderProgress) { - - // Moving the start offset to left only occurs in the first 25% of a - // single ring animation + // Moving the left ball to the left sides only occurs in the first 25% of a jump animation if (renderProgress <= START_LEFT_DURATION_OFFSET) { - float startLeftOffsetProgress = renderProgress / DURATION_OFFSET; + float startLeftOffsetProgress = renderProgress / START_LEFT_DURATION_OFFSET; mStartXOffsetProgress = DECELERATE_INTERPOLATOR.getInterpolation(startLeftOffsetProgress); - - return; } - // Moving the start offset to left only occurs between 25% and 50% of a - // single ring animation + // Moving the left ball to the origin location only occurs between 25% and 50% of a jump ring animation if (renderProgress <= START_RIGHT_DURATION_OFFSET) { - float startRightOffsetProgress = (renderProgress - START_LEFT_DURATION_OFFSET) / DURATION_OFFSET; + float startRightOffsetProgress = (renderProgress - START_LEFT_DURATION_OFFSET) / (START_RIGHT_DURATION_OFFSET - START_LEFT_DURATION_OFFSET); mStartXOffsetProgress = ACCELERATE_INTERPOLATOR.getInterpolation(1.0f - startRightOffsetProgress); - - return; } - // Moving the end offset to right starts between 50% and 75% a single ring - // animation completes + // Moving the right ball to the right sides only occurs between 50% and 75% of a jump animation if (renderProgress <= END_RIGHT_DURATION_OFFSET) { - float endRightOffsetProgress = (renderProgress - START_RIGHT_DURATION_OFFSET) / DURATION_OFFSET; + float endRightOffsetProgress = (renderProgress - START_RIGHT_DURATION_OFFSET) / (END_RIGHT_DURATION_OFFSET - START_RIGHT_DURATION_OFFSET); mEndXOffsetProgress = DECELERATE_INTERPOLATOR.getInterpolation(endRightOffsetProgress); - - return; } - // Moving the end offset to left starts after 75% of a single ring - // animation completes + // Moving the right ball to the origin location only occurs after 75% of a jump animation if (renderProgress <= END_LEFT_DURATION_OFFSET) { - float endRightOffsetProgress = (renderProgress - END_RIGHT_DURATION_OFFSET) / DURATION_OFFSET; + float endRightOffsetProgress = (renderProgress - END_RIGHT_DURATION_OFFSET) / (END_LEFT_DURATION_OFFSET - END_RIGHT_DURATION_OFFSET); mEndXOffsetProgress = ACCELERATE_INTERPOLATOR.getInterpolation(1 - endRightOffsetProgress); - - return; } } @@ -174,28 +176,105 @@ protected void computeRender(float renderProgress) { @Override protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); - } @Override protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - } @Override protected void reset() { } + private void apply(Builder builder) { + this.mWidth = builder.mWidth > 0 ? builder.mWidth : this.mWidth; + this.mHeight = builder.mHeight > 0 ? builder.mHeight : this.mHeight; + + this.mOvalVerticalRadius = builder.mOvalVerticalRadius > 0 ? builder.mOvalVerticalRadius : this.mOvalVerticalRadius; + this.mBallRadius = builder.mBallRadius > 0 ? builder.mBallRadius : this.mBallRadius; + this.mBallMoveXOffsets = builder.mBallMoveXOffsets > 0 ? builder.mBallMoveXOffsets : this.mBallMoveXOffsets; + this.mBallQuadCoefficient = builder.mBallQuadCoefficient > 0 ? builder.mBallQuadCoefficient : this.mBallQuadCoefficient; + this.mBallCount = builder.mBallCount > 0 ? builder.mBallCount : this.mBallCount; + + this.mDuration = builder.mDuration > 0 ? builder.mDuration : this.mDuration; + + this.mColors = builder.mColors != null ? builder.mColors : this.mColors; + + adjustParams(); + setupPaint(); + } + public static class Builder { private Context mContext; + private int mWidth; + private int mHeight; + + private float mOvalVerticalRadius; + + private int mBallCount; + private float mBallRadius; + private float mBallMoveXOffsets; + private float mBallQuadCoefficient; + + private int mDuration; + + @Size(2) + private int[] mColors; + 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 setOvalVerticalRadius(int ovalVerticalRadius) { + this.mOvalVerticalRadius = ovalVerticalRadius; + return this; + } + + public Builder setBallRadius(float ballRadius) { + this.mBallRadius = ballRadius; + return this; + } + + public Builder setBallMoveXOffsets(float ballMoveXOffsets) { + this.mBallMoveXOffsets = ballMoveXOffsets; + return this; + } + + public Builder setBallQuadCoefficient(float ballQuadCoefficient) { + this.mBallQuadCoefficient = ballQuadCoefficient; + return this; + } + + public Builder setBallCount(int ballCount) { + this.mBallCount = ballCount; + return this; + } + + public Builder setColors(@Size(2) int[] colors) { + this.mColors = colors; + return this; + } + + public Builder setDuration(int duration) { + this.mDuration = duration; + return this; + } + public CollisionLoadingRenderer build() { CollisionLoadingRenderer loadingRenderer = new CollisionLoadingRenderer(mContext); + loadingRenderer.apply(this); return loadingRenderer; } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java index 8ad3ed4..97dc2d7 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java @@ -133,29 +133,25 @@ protected void draw(Canvas canvas) { @Override protected void computeRender(float renderProgress) { - // Scaling up the start size only occurs in the first 20% of a - // single ring animation + // 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 + // 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 completes + // 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 completes + // 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); diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java index f0017ee..208699f 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/LevelLoadingRenderer.java @@ -30,7 +30,6 @@ public class LevelLoadingRenderer extends LoadingRenderer { private static final float MAX_SWIPE_DEGREES = 0.8f * DEGREE_360; private static final float FULL_GROUP_ROTATION = 3.0f * DEGREE_360; - private static final float MAX_ROTATION_INCREMENT = 0.25f * DEGREE_360; private static final float[] LEVEL_SWEEP_ANGLE_OFFSETS = new float[]{1.0f, 7.0f / 8.0f, 5.0f / 8.0f}; @@ -126,8 +125,7 @@ protected void draw(Canvas canvas) { @Override protected void computeRender(float renderProgress) { - // Moving the start trim only occurs in the first 50% of a - // single ring animation + // Moving the start trim only occurs in the first 50% of a single ring animation if (renderProgress <= START_TRIM_DURATION_OFFSET) { float startTrimProgress = (renderProgress) / START_TRIM_DURATION_OFFSET; mStartDegrees = mOriginStartDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress); @@ -143,8 +141,7 @@ protected void computeRender(float renderProgress) { mLevelSwipeDegrees[2] = -mSwipeDegrees * LEVEL_SWEEP_ANGLE_OFFSETS[2] * (1.0f + level3Increment); } - // Moving the end trim starts after 50% of a single ring - // animation completes + // Moving the end trim starts after 50% of a single ring animation if (renderProgress > START_TRIM_DURATION_OFFSET) { float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET); mEndDegrees = mOriginEndDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(endTrimProgress); diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java index 83cf4aa..5f87f9d 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/MaterialLoadingRenderer.java @@ -22,7 +22,6 @@ public class MaterialLoadingRenderer extends LoadingRenderer { private static final float MAX_SWIPE_DEGREES = 0.8f * DEGREE_360; private static final float FULL_GROUP_ROTATION = 3.0f * DEGREE_360; - private static final float MAX_ROTATION_INCREMENT = 0.25f * DEGREE_360; private static final float COLOR_START_DELAY_OFFSET = 0.8f; private static final float END_TRIM_DURATION_OFFSET = 1.0f; @@ -119,16 +118,14 @@ protected void draw(Canvas canvas) { protected void computeRender(float renderProgress) { updateRingColor(renderProgress); - // Moving the start trim only occurs in the first 50% of a - // single ring animation + // Moving the start trim only occurs in the first 50% of a single ring animation if (renderProgress <= START_TRIM_DURATION_OFFSET) { float startTrimProgress = renderProgress / START_TRIM_DURATION_OFFSET; mStartDegrees = mOriginStartDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress); } - // Moving the end trim starts after 50% of a single ring - // animation completes + // Moving the end trim starts after 50% of a single ring animation completes if (renderProgress > START_TRIM_DURATION_OFFSET) { float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET); diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java index dbd3453..827ce2b 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/WhorlLoadingRenderer.java @@ -25,7 +25,6 @@ public class WhorlLoadingRenderer extends LoadingRenderer { private static final float MAX_SWIPE_DEGREES = 0.6f * DEGREE_360; private static final float FULL_GROUP_ROTATION = 3.0f * DEGREE_360; - private static final float MAX_ROTATION_INCREMENT = 0.25f * DEGREE_360; private static final float START_TRIM_DURATION_OFFSET = 0.5f; private static final float END_TRIM_DURATION_OFFSET = 1.0f; @@ -135,15 +134,13 @@ private RectF createArcBounds(RectF sourceArcBounds, int index) { @Override protected void computeRender(float renderProgress) { - // Moving the start trim only occurs in the first 50% of a - // single ring animation + // Moving the start trim only occurs in the first 50% of a single ring animation if (renderProgress <= START_TRIM_DURATION_OFFSET) { float startTrimProgress = (renderProgress) / (1.0f - START_TRIM_DURATION_OFFSET); mStartDegrees = mOriginStartDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress); } - // Moving the end trim starts after 50% of a single ring - // animation completes + // Moving the end trim starts after 50% of a single ring animation if (renderProgress > START_TRIM_DURATION_OFFSET) { float endTrimProgress = (renderProgress - START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET); mEndDegrees = mOriginEndDegrees + MAX_SWIPE_DEGREES * MATERIAL_INTERPOLATOR.getInterpolation(endTrimProgress); From c1294af26a0d321e7684d4453c41dc9017fd1376 Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Mon, 8 Aug 2016 23:51:40 +0800 Subject: [PATCH 10/14] add QQ group --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 8c898e5..cc4a311 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,8 @@ Learn more about LoadingDrawable on the [Wiki Home] (https://github.com/dinuscxj * star this repo * send me some feedback. Thanks! + + ***QQ Group:*** **342748245** ## License Copyright 2015-2019 dinus From e8b1bb40f40fb2a4807c2a6527525924ed77b0ae Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Sun, 14 Aug 2016 23:32:59 +0800 Subject: [PATCH 11/14] optimize SwapLoadingRenderer --- .gitignore | 1 + LoadingDrawable.iml | 19 -- README.md | 2 +- app/app.iml | 120 ---------- .../dinus/com/example/CircleJumpActivity.java | 7 - library/library.iml | 110 ---------- .../circle/jump/CollisionLoadingRenderer.java | 49 +++-- .../circle/jump/SwapLoadingRenderer.java | 205 +++++++++++------- .../circle/rotate/GearLoadingRenderer.java | 2 - 9 files changed, 161 insertions(+), 354 deletions(-) delete mode 100644 LoadingDrawable.iml delete mode 100644 app/app.iml delete mode 100644 library/library.iml diff --git a/.gitignore b/.gitignore index a881469..e479603 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ .DS_Store /build /captures +*.iml \ No newline at end of file diff --git a/LoadingDrawable.iml b/LoadingDrawable.iml deleted file mode 100644 index eb791b2..0000000 --- a/LoadingDrawable.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index cc4a311..8a5ed35 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## LoadingDrawable: Android cool animation collection [前言](http://www.jianshu.com/p/6e0ac5af4e8b)    -[Circle系列源码解析](http://www.jianshu.com/p/1c3c6fc1b7ff)    +[CircleRotate源码解析](http://www.jianshu.com/p/1c3c6fc1b7ff)    [Fish源码解析](http://blog.csdn.net/XSF50717/article/details/51494266)
[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-LoadingDrawable-brightgreen.svg?style=flat)](http://android-arsenal.com/details/1/3450) diff --git a/app/app.iml b/app/app.iml deleted file mode 100644 index c8d9349..0000000 --- a/app/app.iml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java b/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java index 77cee01..bf95c98 100644 --- a/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java +++ b/app/src/main/java/app/dinus/com/example/CircleJumpActivity.java @@ -2,15 +2,8 @@ import android.content.Context; import android.content.Intent; -import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.ViewUtils; - -import app.dinus.com.loadingdrawable.DensityUtil; -import app.dinus.com.loadingdrawable.LoadingView; -import app.dinus.com.loadingdrawable.render.LoadingRenderer; -import app.dinus.com.loadingdrawable.render.circle.jump.CollisionLoadingRenderer; public class CircleJumpActivity extends AppCompatActivity { public static void startActivity(Context context) { diff --git a/library/library.iml b/library/library.iml deleted file mode 100644 index ed83241..0000000 --- a/library/library.iml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java index 6b4eaff..a6296a7 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/CollisionLoadingRenderer.java @@ -20,6 +20,9 @@ public class CollisionLoadingRenderer extends LoadingRenderer { private static final Interpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator(); private static final Interpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator(); + private static final int MAX_ALPHA = 255; + private static final int OVAL_ALPHA = 64; + private static final int DEFAULT_BALL_COUNT = 7; private static final float DEFAULT_OVAL_HEIGHT = 1.5f; @@ -33,14 +36,14 @@ public class CollisionLoadingRenderer extends LoadingRenderer { private static final float END_LEFT_DURATION_OFFSET = 1.0f; private static final int[] DEFAULT_COLORS = new int[]{ - Color.RED, Color.GREEN + Color.parseColor("#FF28435D"), Color.parseColor("#FFC32720") }; private static final float[] DEFAULT_POSITIONS = new float[]{ 0.0f, 1.0f }; - private final Paint mPaint = new Paint(); + private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final RectF mOvalRect = new RectF(); @Size(2) @@ -54,7 +57,7 @@ public class CollisionLoadingRenderer extends LoadingRenderer { private float mBallRadius; private float mBallCenterY; - private float mSideOffsets; + private float mBallSideOffsets; private float mBallMoveXOffsets; private float mBallQuadCoefficient; @@ -73,11 +76,11 @@ private void init(Context context) { mHeight = DensityUtil.dip2px(context, DEFAULT_HEIGHT); mOvalVerticalRadius = DensityUtil.dip2px(context, DEFAULT_OVAL_HEIGHT); - mBallCount = DEFAULT_BALL_COUNT; - mColors = DEFAULT_COLORS; mPositions = DEFAULT_POSITIONS; + mBallCount = DEFAULT_BALL_COUNT; + //mBallMoveYOffsets = mBallQuadCoefficient * mBallMoveXOffsets ^ 2 // ==> if mBallMoveYOffsets == mBallMoveXOffsets // ==> mBallQuadCoefficient = 1.0f / mBallMoveXOffsets; @@ -87,14 +90,12 @@ private void init(Context context) { private void adjustParams() { mBallCenterY = mHeight / 2.0f; - mSideOffsets = (mWidth - mBallRadius * 2.0f * (mBallCount - 2)) / 2; + mBallSideOffsets = (mWidth - mBallRadius * 2.0f * (mBallCount - 2)) / 2; } private void setupPaint() { - mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.FILL); - - mPaint.setShader(new LinearGradient(mSideOffsets, 0, mWidth - mSideOffsets, 0, + mPaint.setShader(new LinearGradient(mBallSideOffsets, 0, mWidth - mBallSideOffsets, 0, mColors, mPositions, Shader.TileMode.CLAMP)); } @@ -107,13 +108,15 @@ protected void draw(Canvas canvas) { if (i == 0 && mStartXOffsetProgress != 0) { float xMoveOffset = mBallMoveXOffsets * mStartXOffsetProgress; float yMoveOffset = (float) (Math.pow(xMoveOffset, 2) * mBallQuadCoefficient); - canvas.drawCircle(mSideOffsets - mBallRadius - xMoveOffset, mBallCenterY - yMoveOffset, mBallRadius, mPaint); + mPaint.setAlpha(MAX_ALPHA); + canvas.drawCircle(mBallSideOffsets - mBallRadius - xMoveOffset, mBallCenterY - yMoveOffset, mBallRadius, mPaint); float leftStartProgress = 1.0f - mStartXOffsetProgress; - mOvalRect.set(mSideOffsets - mBallRadius - mBallRadius * leftStartProgress - xMoveOffset, + mOvalRect.set(mBallSideOffsets - mBallRadius - mBallRadius * leftStartProgress - xMoveOffset, mHeight - mOvalVerticalRadius - mOvalVerticalRadius * leftStartProgress, - mSideOffsets - mBallRadius + mBallRadius * leftStartProgress - xMoveOffset, + mBallSideOffsets - mBallRadius + mBallRadius * leftStartProgress - xMoveOffset, mHeight - mOvalVerticalRadius + mOvalVerticalRadius * leftStartProgress); + mPaint.setAlpha(OVAL_ALPHA); canvas.drawOval(mOvalRect, mPaint); continue; } @@ -121,21 +124,25 @@ protected void draw(Canvas canvas) { if (i == mBallCount - 1 && mEndXOffsetProgress != 0) { float xMoveOffset = mBallMoveXOffsets * mEndXOffsetProgress; float yMoveOffset = (float) (Math.pow(xMoveOffset, 2) * mBallQuadCoefficient); - canvas.drawCircle(mBallRadius * (mBallCount * 2 - 3) + mSideOffsets + xMoveOffset, mBallCenterY - yMoveOffset, mBallRadius, mPaint); + mPaint.setAlpha(MAX_ALPHA); + canvas.drawCircle(mBallRadius * (mBallCount * 2 - 3) + mBallSideOffsets + xMoveOffset, mBallCenterY - yMoveOffset, mBallRadius, mPaint); float leftEndProgress = 1.0f - mEndXOffsetProgress; - mOvalRect.set(mBallRadius * (mBallCount * 2 - 3) - mBallRadius * leftEndProgress + mSideOffsets + xMoveOffset, + mOvalRect.set(mBallRadius * (mBallCount * 2 - 3) - mBallRadius * leftEndProgress + mBallSideOffsets + xMoveOffset, mHeight - mOvalVerticalRadius - mOvalVerticalRadius * leftEndProgress, - mBallRadius * (mBallCount * 2 - 3) + mBallRadius * leftEndProgress + mSideOffsets + xMoveOffset, + mBallRadius * (mBallCount * 2 - 3) + mBallRadius * leftEndProgress + mBallSideOffsets + xMoveOffset, mHeight - mOvalVerticalRadius + mOvalVerticalRadius * leftEndProgress); + mPaint.setAlpha(OVAL_ALPHA); canvas.drawOval(mOvalRect, mPaint); continue; } - canvas.drawCircle(mBallRadius * (i * 2 - 1) + mSideOffsets, mBallCenterY, mBallRadius, mPaint); + mPaint.setAlpha(MAX_ALPHA); + canvas.drawCircle(mBallRadius * (i * 2 - 1) + mBallSideOffsets, mBallCenterY, mBallRadius, mPaint); - mOvalRect.set(mBallRadius * (i * 2 - 2) + mSideOffsets, mHeight - mOvalVerticalRadius * 2, - mBallRadius * (i * 2) + mSideOffsets, mHeight); + mOvalRect.set(mBallRadius * (i * 2 - 2) + mBallSideOffsets, mHeight - mOvalVerticalRadius * 2, + mBallRadius * (i * 2) + mBallSideOffsets, mHeight); + mPaint.setAlpha(OVAL_ALPHA); canvas.drawOval(mOvalRect, mPaint); } @@ -242,17 +249,17 @@ public Builder setOvalVerticalRadius(int ovalVerticalRadius) { return this; } - public Builder setBallRadius(float ballRadius) { + public Builder setBallRadius(int ballRadius) { this.mBallRadius = ballRadius; return this; } - public Builder setBallMoveXOffsets(float ballMoveXOffsets) { + public Builder setBallMoveXOffsets(int ballMoveXOffsets) { this.mBallMoveXOffsets = ballMoveXOffsets; return this; } - public Builder setBallQuadCoefficient(float ballQuadCoefficient) { + public Builder setBallQuadCoefficient(int ballQuadCoefficient) { this.mBallQuadCoefficient = ballQuadCoefficient; return this; } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java index fcea333..af532b6 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/jump/SwapLoadingRenderer.java @@ -5,163 +5,220 @@ import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.RectF; -import android.support.v4.view.animation.FastOutSlowInInterpolator; -import android.util.DisplayMetrics; -import android.util.TypedValue; +import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Interpolator; import app.dinus.com.loadingdrawable.DensityUtil; import app.dinus.com.loadingdrawable.render.LoadingRenderer; public class SwapLoadingRenderer extends LoadingRenderer { - private static final Interpolator MATERIAL_INTERPOLATOR = new FastOutSlowInInterpolator(); + private static final Interpolator ACCELERATE_DECELERATE_INTERPOLATOR = new AccelerateDecelerateInterpolator(); private static final long ANIMATION_DURATION = 2500; - private static final int CIRCLE_COUNT = 5; + private static final int DEFAULT_CIRCLE_COUNT = 5; - //(CIRCLE_COUNT - 1) / 2 is the Circle interval width; the 2 * 2 is the both side inset - private static final float DEFAULT_WIDTH = 15.0f * (CIRCLE_COUNT + (CIRCLE_COUNT - 1) / 2 + 2 * 2); - //the 2 * 2 is the both side inset - private static final float DEFAULT_HEIGHT = 15.0f * (1 + 2 * 2); + private static final float DEFAULT_BALL_RADIUS = 7.5f; + private static final float DEFAULT_WIDTH = 15.0f * 11; + private static final float DEFAULT_HEIGHT = 15.0f * 5; private static final float DEFAULT_STROKE_WIDTH = 1.5f; private static final int DEFAULT_COLOR = Color.WHITE; - private final Paint mPaint = new Paint(); - private final RectF mTempBounds = new RectF(); + private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private int mColor; private int mSwapIndex; + private int mBallCount; - private float mSwapThreshold; - private float mSwapXOffsetProgress; + private float mBallSideOffsets; + private float mBallCenterY; + private float mBallRadius; + private float mBallInterval; + private float mSwapBallCenterX; + private float mSwapBallCenterY; + private float mASwapThreshold; private float mStrokeWidth; private SwapLoadingRenderer(Context context) { super(context); - mDuration = ANIMATION_DURATION; init(context); + adjustParams(); setupPaint(); } private void init(Context context) { mWidth = DensityUtil.dip2px(context, DEFAULT_WIDTH); mHeight = DensityUtil.dip2px(context, DEFAULT_HEIGHT); + mBallRadius = DensityUtil.dip2px(context, DEFAULT_BALL_RADIUS); mStrokeWidth = DensityUtil.dip2px(context, DEFAULT_STROKE_WIDTH); - mSwapThreshold = 1.0f / CIRCLE_COUNT; + mColor = DEFAULT_COLOR; + mDuration = ANIMATION_DURATION; + mBallCount = DEFAULT_CIRCLE_COUNT; + + mBallInterval = mBallRadius; } - private void setupPaint() { - mColor = DEFAULT_COLOR; + private void adjustParams() { + mBallCenterY = mHeight / 2.0f; + mBallSideOffsets = (mWidth - mBallRadius * 2 * mBallCount - mBallInterval * (mBallCount - 1)) / 2.0f; - mPaint.setAntiAlias(true); - mPaint.setStrokeWidth(mStrokeWidth); - mPaint.setStyle(Paint.Style.FILL); + mASwapThreshold = 1.0f / mBallCount; } - @Override - protected void draw(Canvas canvas, Rect bounds) { + private void setupPaint() { mPaint.setColor(mColor); + mPaint.setStrokeWidth(mStrokeWidth); + } + @Override + protected void draw(Canvas canvas) { int saveCount = canvas.save(); - RectF arcBounds = mTempBounds; - arcBounds.set(bounds); - - float cy = mHeight / 2; - float circleRadius = computeCircleRadius(arcBounds); - - float sideOffset = 2.0f * (2 * circleRadius); - float intervalWidth = circleRadius; - - float circleDiameter = mSwapIndex == CIRCLE_COUNT - 1 - ? circleRadius * (CIRCLE_COUNT - 1) * 3 - : circleRadius * 3; - - //x^2 + y^2 = (3 * circleRadius / 2) ^ 2 - float xMoveOffset = mSwapIndex == CIRCLE_COUNT - 1 - ? -mSwapXOffsetProgress * circleDiameter - : mSwapXOffsetProgress * circleDiameter; - //the y axial symmetry - float xCoordinate = mSwapIndex == CIRCLE_COUNT - 1 - ? xMoveOffset + circleDiameter / 2 - : xMoveOffset - circleDiameter / 2; - float yMoveOffset = (float) (mSwapIndex % 2 == 0 && mSwapIndex != CIRCLE_COUNT - 1 - ? Math.sqrt(Math.pow(circleDiameter / 2, 2.0f) - Math.pow(xCoordinate, 2.0f)) - : -Math.sqrt(Math.pow(circleDiameter / 2, 2.0f) - Math.pow(xCoordinate, 2.0f))); - - for (int i = 0; i < CIRCLE_COUNT; i++) { + for (int i = 0; i < mBallCount; i++) { if (i == mSwapIndex) { mPaint.setStyle(Paint.Style.FILL); - canvas.drawCircle(circleRadius * (i * 2 + 1) + sideOffset + i * intervalWidth + xMoveOffset - , cy - yMoveOffset, circleRadius - mStrokeWidth / 2, mPaint); - } else if (i == (mSwapIndex + 1) % CIRCLE_COUNT) { + canvas.drawCircle(mBallRadius * (i * 2 + 1) + mBallSideOffsets + i * mBallInterval + mSwapBallCenterX + , mBallCenterY - mSwapBallCenterY, mBallRadius, mPaint); + } else if (i == (mSwapIndex + 1) % mBallCount) { mPaint.setStyle(Paint.Style.STROKE); - - canvas.drawCircle(circleRadius * (i * 2 + 1) + sideOffset + i * intervalWidth - xMoveOffset - , cy + yMoveOffset, circleRadius - mStrokeWidth / 2, mPaint); + canvas.drawCircle(mBallRadius * (i * 2 + 1) + mBallSideOffsets + i * mBallInterval - mSwapBallCenterX + , mBallCenterY + mSwapBallCenterY, mBallRadius - mStrokeWidth / 2, mPaint); } else { mPaint.setStyle(Paint.Style.STROKE); - - canvas.drawCircle(circleRadius * (i * 2 + 1) + sideOffset + i * intervalWidth, cy, - circleRadius - mStrokeWidth / 2, mPaint); + canvas.drawCircle(mBallRadius * (i * 2 + 1) + mBallSideOffsets + i * mBallInterval, mBallCenterY, + mBallRadius - mStrokeWidth / 2, mPaint); } - } canvas.restoreToCount(saveCount); } - private float computeCircleRadius(RectF rectBounds) { - float width = rectBounds.width(); - float height = rectBounds.height(); - - //CIRCLE_COUNT + 4 is the sliding distance of both sides - float radius = Math.min(width / (CIRCLE_COUNT + (CIRCLE_COUNT - 1) / 2 + 2 * 2) / 2, height / 2); - return radius; - } - @Override protected void computeRender(float renderProgress) { - mSwapIndex = (int) (renderProgress / mSwapThreshold); - mSwapXOffsetProgress = MATERIAL_INTERPOLATOR.getInterpolation( - (renderProgress - mSwapIndex * mSwapThreshold) / mSwapThreshold); + mSwapIndex = (int) (renderProgress / mASwapThreshold); + + // Swap trace : x^2 + y^2 = r ^ 2 + float swapTraceProgress = ACCELERATE_DECELERATE_INTERPOLATOR.getInterpolation( + (renderProgress - mSwapIndex * mASwapThreshold) / mASwapThreshold); + + float swapTraceRadius = mSwapIndex == mBallCount - 1 + ? (mBallRadius * 2 * (mBallCount - 1) + mBallInterval * (mBallCount - 1)) / 2 + : (mBallRadius * 2 + mBallInterval) / 2; + mSwapBallCenterX = mSwapIndex == mBallCount - 1 + ? -swapTraceProgress * swapTraceRadius * 2 + : swapTraceProgress * swapTraceRadius * 2; + + // (r, r) as the origin of coordinates + float xCoordinate = mSwapIndex == mBallCount - 1 + ? mSwapBallCenterX + swapTraceRadius + : mSwapBallCenterX - swapTraceRadius; + + // Calculate the coordinate y + mSwapBallCenterY = (float) (mSwapIndex % 2 == 0 && mSwapIndex != mBallCount - 1 + ? Math.sqrt(Math.pow(swapTraceRadius, 2.0f) - Math.pow(xCoordinate, 2.0f)) + : -Math.sqrt(Math.pow(swapTraceRadius, 2.0f) - Math.pow(xCoordinate, 2.0f))); } @Override protected void setAlpha(int alpha) { mPaint.setAlpha(alpha); - } @Override protected void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); - } @Override protected void reset() { } + 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.mBallRadius = builder.mBallRadius > 0 ? builder.mBallRadius : this.mBallRadius; + this.mBallInterval = builder.mBallInterval > 0 ? builder.mBallInterval : this.mBallInterval; + this.mBallCount = builder.mBallCount > 0 ? builder.mBallCount : this.mBallCount; + + this.mColor = builder.mColor != 0 ? builder.mColor : this.mColor; + + this.mDuration = builder.mDuration > 0 ? builder.mDuration : this.mDuration; + + adjustParams(); + setupPaint(); + } + public static class Builder { private Context mContext; + private int mWidth; + private int mHeight; + private int mStrokeWidth; + + private int mBallCount; + private int mBallRadius; + private int mBallInterval; + + private int mDuration; + + private int mColor; + 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 setBallRadius(int ballRadius) { + this.mBallRadius = ballRadius; + return this; + } + + public Builder setBallInterval(int ballInterval) { + this.mBallInterval = ballInterval; + return this; + } + + public Builder setBallCount(int ballCount) { + this.mBallCount = ballCount; + return this; + } + + public Builder setColor(int color) { + this.mColor = color; + return this; + } + + public Builder setDuration(int duration) { + this.mDuration = duration; + return this; + } + public SwapLoadingRenderer build() { SwapLoadingRenderer loadingRenderer = new SwapLoadingRenderer(mContext); + loadingRenderer.apply(this); return loadingRenderer; } } diff --git a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java index 97dc2d7..b1f4c00 100644 --- a/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java +++ b/library/src/main/java/app/dinus/com/loadingdrawable/render/circle/rotate/GearLoadingRenderer.java @@ -85,8 +85,6 @@ private GearLoadingRenderer(Context context) { init(context); setupPaint(); addRenderListener(mAnimatorListener); - - mDuration = 10000; } private void init(Context context) { From 1d8bc276e13d52fb97dd83ffd2770c977d03fb85 Mon Sep 17 00:00:00 2001 From: dinuscxj <13836160245@163.com> Date: Tue, 16 Aug 2016 23:22:49 +0800 Subject: [PATCH 12/14] update CircleJumpDrawable.gif --- Preview/CircleJumpDrawable.gif | Bin 1292767 -> 1046350 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Preview/CircleJumpDrawable.gif b/Preview/CircleJumpDrawable.gif index 5345ad65997952f98515e314efec0c34fc7c3d37..58af6683b25d78246c8a266dd37f103b4f60fc5d 100644 GIT binary patch literal 1046350 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
Okos6_J#(f{E-K_f|ge#lKD$bt%To9jY3 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