版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
}