Android属性动画(二):深入valueAnimator和objecAnimator

来源:互联网 发布:乌鲁木齐有4g网络吗 编辑:程序博客网 时间:2024/05/22 00:21

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 {@Overridepublic 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);}@Overrideprotected 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() {@Overridepublic 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的颜色

0 0
原创粉丝点击