属性动画ValueAnimator------自定义进度条

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yuanjw2014/article/details/52332740

https://material.uplabs.com/posts/loader-success看到一个加载成功的动效,用ValueAnimator做个DemoView

package card.test.com.testcard;

import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;

/**
 * Created by seed on 16/8/25.
 */
public class Progress1 extends View{

    private Paint mPaint;
    private int mOuterStart=45;
    private int mOutSwap=300;
    private int mInnerStart=90;
    private int mInnerSwap=270;
    private AnimatorSet set;
    private boolean isComplete;
    private float mDownX;
    private float mDownY;
    private float mUpX;
    private float mUpY;
    private boolean upStart;

    public Progress1(Context context) {
        super(context);
        init();
    }

    public Progress1(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public Progress1(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint=new Paint();
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(Color.rgb(255,255,0));
        mPaint.setStrokeWidth(10);
        PropertyValuesHolder outStart=PropertyValuesHolder.ofInt("outStart",45,335,375,585,915,975,1125);
        PropertyValuesHolder outSwap=PropertyValuesHolder.ofInt("outSwap",335,375,405,915,975,1005,1415);
        ValueAnimator outAnimator=ValueAnimator.ofPropertyValuesHolder(outStart,outSwap);
        outAnimator.setInterpolator(new LinearInterpolator());
        outAnimator.setDuration(2000);
        outAnimator.setRepeatCount(ValueAnimator.INFINITE);
        outAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mOuterStart= (int) animation.getAnimatedValue("outStart");
                mOutSwap= (int) animation.getAnimatedValue("outSwap");
            }
        });
        outAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {

            }

            @Override
            public void onAnimationCancel(Animator animation) {
                int start=mOuterStart%360;
                int end=mOutSwap%360;
                PropertyValuesHolder finishStart=PropertyValuesHolder.ofInt("finishStart",start,start+45);
                PropertyValuesHolder finishEnd=PropertyValuesHolder.ofInt("finishEnd",end,start+405);
                ValueAnimator anim=ValueAnimator.ofPropertyValuesHolder(finishStart,finishEnd);
                anim.setDuration(2000);
                anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        mOuterStart= (int) animation.getAnimatedValue("finishStart");
                        mOutSwap= (int) animation.getAnimatedValue("finishEnd");
                        invalidate();
                    }
                });
                anim.start();
            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
        PropertyValuesHolder innerStart=PropertyValuesHolder.ofInt("innerStart",90,65,15,-465,-515,-565,-990);
        PropertyValuesHolder innerEnd=PropertyValuesHolder.ofInt("innerSwap",45,15,-285,-515,-565,-865,-1035);
        ValueAnimator innerAnimator=ValueAnimator.ofPropertyValuesHolder(innerStart,innerEnd);
        innerAnimator.setInterpolator(new LinearInterpolator());
        innerAnimator.setDuration(2000);
        innerAnimator.setRepeatCount(ValueAnimator.INFINITE);
        innerAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mInnerStart= (int) animation.getAnimatedValue("innerStart");
                mInnerSwap= (int) animation.getAnimatedValue("innerSwap");
                invalidate();
            }
        });
        innerAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {

            }

            @Override
            public void onAnimationCancel(Animator animation) {
                completeAnimate();
            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
         set=new AnimatorSet();
        set.play(outAnimator).with(innerAnimator);
        set.start();


    }

    private void completeAnimate() {
        int start=mInnerStart%360;
        int end=mInnerSwap%360;
        if(start<0||end<0){
            start+=360;
            end+=360;
        }
        PropertyValuesHolder finishStart=PropertyValuesHolder.ofInt("finishStart",start,-135);
        PropertyValuesHolder finishEnd=PropertyValuesHolder.ofInt("finishEnd",end,-180);
        final ValueAnimator anim=ValueAnimator.ofPropertyValuesHolder(finishStart,finishEnd);
        anim.setDuration(500);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mInnerStart= (int) animation.getAnimatedValue("finishStart");
                mInnerSwap= (int) animation.getAnimatedValue("finishEnd");
                invalidate();
            }
        });

        PropertyValuesHolder finish=PropertyValuesHolder.ofInt("finishStart",-135,-180);
        PropertyValuesHolder x=PropertyValuesHolder.ofFloat("downX",80,120);
        PropertyValuesHolder y=PropertyValuesHolder.ofFloat("downY",130,170);
        ValueAnimator anim1=ValueAnimator.ofPropertyValuesHolder(finish,x,y);
        anim1.setDuration(500);
        anim1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                isComplete=true;
                mInnerStart= (int) animation.getAnimatedValue("finishStart");
                mDownX= (float) animation.getAnimatedValue("downX");
                mDownY=(float) animation.getAnimatedValue("downY");
                invalidate();
            }
        });
        anim1.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                PropertyValuesHolder x1=PropertyValuesHolder.ofFloat("upX",120,170);
                PropertyValuesHolder y1=PropertyValuesHolder.ofFloat("upY",170,80);
                ValueAnimator anim2=ValueAnimator.ofPropertyValuesHolder(x1,y1);
                anim2.setDuration(500);
                anim2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        upStart=true;
                        mUpX= (float) animation.getAnimatedValue("upX");
                        mUpY=(float) animation.getAnimatedValue("upY");
                        invalidate();
                    }
                });
                anim2.start();
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });

        AnimatorSet set=new AnimatorSet();
        set.play(anim).before(anim1);
        set.start();

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        canvas.drawArc(new RectF(30,30,230,230),mOuterStart,mOutSwap-mOuterStart,false,mPaint);
        canvas.drawArc(new RectF(80,80,180,180),mInnerStart,mInnerSwap-mInnerStart,false,mPaint);
        if (isComplete){
            canvas.drawLine(80,130,mDownX,mDownY,mPaint);
        }
        if(upStart){
            canvas.drawLine(120,170,mUpX,mUpY,mPaint);
        }
    }

   public void complete(){
       set.cancel();
   }
}

猜你喜欢

转载自blog.csdn.net/yuanjw2014/article/details/52332740