ValueAnimator的高级用法
无论是valueAnimator还是objectAnimator都离不开TypeEvaluator的使用,那TypeEvaluator是用来干嘛的?
TypeEvaluator是用来告知动画系统如何从开始值过渡到结束值,例如上一篇文章中使用的valueAnimator的offInt()的实现,其实就是内
置了一个TypeEvaluator来实现的。
接下来我们用一个实例来学习ValueAnimator的高级用法,该实例实现一个圆点Point从屏幕左上角移到右下角。
1.首先创建实体类Point
public class Point {
private float x;
private float y;
public Point(float x, float y){
this.x = x;
this.y = y;
}
public float getX() {
return x;
}
public float getY() {
return y;
}
}
2.创建一个MyEvaluator去实现TypeEvaluator接口
public class PointEvaluator implements TypeEvaluator {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
Point startPoint = (Point) startValue;
Point endPoint = (Point) endValue;
float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
Point point = new Point(x, y);
return point;
}
}
这里的fraction很重要,它告知了我们当前动画的完成度
3.然后我们自定义一个view
public class MyView extends View {
private static final float RADIUS = 50f;
private Paint paint;
private Point currentPoint;
//换成一参数构造方法就不能运行了
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLUE);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(currentPoint == null){
currentPoint = new Point(RADIUS, RADIUS);
drawCircle(canvas);
startAnimation();
}else{
drawCircle(canvas);
}
}
public void drawCircle(Canvas canvas){
float x = currentPoint.getX();
float y = currentPoint.getY();
canvas.drawCircle(x, y, RADIUS, paint);
}
public void startAnimation(){
Point startPoint = new Point(RADIUS, RADIUS);
Point endPoint = new Point(getWidth() - RADIUS, getHeight() - RADIUS);
ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (Point) animation.getAnimatedValue();
invalidate();//刷新view视图,触发onDraw的调用
}
});
anim.setDuration(5000);
anim.start();
}
}
首先在构造方法里实例化了一个画笔Paint,并设置了Piant的属性。Paint.ANTI_ALIAS_FLAG是使位图抗锯齿的标志,并把画笔颜色
设置为蓝色。drawCicle()方法中用Canvas的drawCircle()画出了一个圆。接着实现了view的onDraw()方法,并在onDraw()中去绘制。
startAnimation()用于播放动画,ValueAnimator的ofObject()中,首先传入Evaluator的实例,然后后面的参数告知如何变化。其中在监
听器中添加invalidate()方法,使得每一次动画发生了变化,就刷新视图,因此会触发onDraw()的调用,重新绘制视图
二:ObjectAnimator的高级用法
可以结合上面实例,在动画播放中,改变Point的颜色