From 7a666a9986ce3f2f0b28c99734bc0000df6a46a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=91=9E=E6=B3=BD?= <729454040@qq.com> Date: Sat, 27 May 2017 17:07:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=8A=A8=E7=94=BB?= =?UTF-8?q?=E8=BF=87=E6=B8=A1=E6=95=88=E6=9E=9C=20Add=20animation=20betwee?= =?UTF-8?q?n=20every=20setProgress.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/MainActivity.java | 4 +-- .../numberprogressbar/NumberProgressBar.java | 36 ++++++++++++++++--- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/demo/src/main/java/com/daimajia/numberprogressbar/example/MainActivity.java b/demo/src/main/java/com/daimajia/numberprogressbar/example/MainActivity.java index f523a78..e1b24f6 100644 --- a/demo/src/main/java/com/daimajia/numberprogressbar/example/MainActivity.java +++ b/demo/src/main/java/com/daimajia/numberprogressbar/example/MainActivity.java @@ -32,11 +32,11 @@ public void run() { runOnUiThread(new Runnable() { @Override public void run() { - bnp.incrementProgressBy(1); + bnp.incrementProgressBy(5); } }); } - }, 1000, 100); + }, 1000, 1000); } @Override diff --git a/library/src/main/java/com/daimajia/numberprogressbar/NumberProgressBar.java b/library/src/main/java/com/daimajia/numberprogressbar/NumberProgressBar.java index a48b425..ca9fc1c 100644 --- a/library/src/main/java/com/daimajia/numberprogressbar/NumberProgressBar.java +++ b/library/src/main/java/com/daimajia/numberprogressbar/NumberProgressBar.java @@ -10,6 +10,7 @@ import android.os.Parcelable; import android.util.AttributeSet; import android.view.View; +import android.view.animation.DecelerateInterpolator; import static com.daimajia.numberprogressbar.NumberProgressBar.ProgressTextVisibility.Invisible; import static com.daimajia.numberprogressbar.NumberProgressBar.ProgressTextVisibility.Visible; @@ -19,6 +20,7 @@ */ public class NumberProgressBar extends View { + private static final long ANIMATION_DURATION = 300; private int mMaxProgress = 100; /** @@ -150,10 +152,15 @@ public class NumberProgressBar extends View { private boolean mIfDrawText = true; + private DecelerateInterpolator mInterpolator; + + /** * Listener */ private OnProgressBarListener mListener; + private int mAnimationFrom; + private long mAnimationStartTime; public enum ProgressTextVisibility { Visible, Invisible @@ -193,6 +200,8 @@ public NumberProgressBar(Context context, AttributeSet attrs, int defStyleAttr) mIfDrawText = false; } + mInterpolator = new DecelerateInterpolator(); + setProgress(attributes.getInt(R.styleable.NumberProgressBar_progress_current, 0)); setMax(attributes.getInt(R.styleable.NumberProgressBar_progress_max, 100)); @@ -254,6 +263,12 @@ protected void onDraw(Canvas canvas) { if (mIfDrawText) canvas.drawText(mCurrentDrawText, mDrawTextStart, mDrawTextEnd, mTextPaint); + + if (needAnimation()) invalidate(); + } + + private boolean needAnimation() { + return System.currentTimeMillis() - mAnimationStartTime <= ANIMATION_DURATION; } private void initializePainters() { @@ -272,7 +287,7 @@ private void initializePainters() { private void calculateDrawRectFWithoutProgressText() { mReachedRectF.left = getPaddingLeft(); mReachedRectF.top = getHeight() / 2.0f - mReachedBarHeight / 2.0f; - mReachedRectF.right = (getWidth() - getPaddingLeft() - getPaddingRight()) / (getMax() * 1.0f) * getProgress() + getPaddingLeft(); + mReachedRectF.right = (getWidth() - getPaddingLeft() - getPaddingRight()) / (getMax() * 1.0f) * getAnimateProgress() + getPaddingLeft(); mReachedRectF.bottom = getHeight() / 2.0f + mReachedBarHeight / 2.0f; mUnreachedRectF.left = mReachedRectF.right; @@ -294,7 +309,7 @@ private void calculateDrawRectF() { mDrawReachedBar = true; mReachedRectF.left = getPaddingLeft(); mReachedRectF.top = getHeight() / 2.0f - mReachedBarHeight / 2.0f; - mReachedRectF.right = (getWidth() - getPaddingLeft() - getPaddingRight()) / (getMax() * 1.0f) * getProgress() - mOffset + getPaddingLeft(); + mReachedRectF.right = (getWidth() - getPaddingLeft() - getPaddingRight()) / (getMax() * 1.0f) * getAnimateProgress() - mOffset + getPaddingLeft(); mReachedRectF.bottom = getHeight() / 2.0f + mReachedBarHeight / 2.0f; mDrawTextStart = (mReachedRectF.right + mOffset); } @@ -348,6 +363,12 @@ public int getProgress() { return mCurrentProgress; } + private float getAnimateProgress() { + final long time = System.currentTimeMillis() - mAnimationStartTime; + if (time >= ANIMATION_DURATION) return getProgress(); + return mAnimationFrom + mInterpolator.getInterpolation((float) time / ANIMATION_DURATION) * (getProgress() - mAnimationFrom); + } + public int getMax() { return mMaxProgress; } @@ -428,18 +449,25 @@ public void incrementProgressBy(int by) { setProgress(getProgress() + by); } - if(mListener != null){ + if (mListener != null) { mListener.onProgressChange(getProgress(), getMax()); } } public void setProgress(int progress) { if (progress <= getMax() && progress >= 0) { + startAnimation(this.mCurrentProgress, progress); this.mCurrentProgress = progress; invalidate(); } } + private void startAnimation(int from, int to) { + this.mAnimationFrom = from; + this.mAnimationStartTime = System.currentTimeMillis(); + } + + @Override protected Parcelable onSaveInstanceState() { final Bundle bundle = new Bundle(); @@ -499,7 +527,7 @@ public boolean getProgressTextVisibility() { return mIfDrawText; } - public void setOnProgressBarListener(OnProgressBarListener listener){ + public void setOnProgressBarListener(OnProgressBarListener listener) { mListener = listener; } }