- 作用:根据当前属性改变的百分比来计算改变后的属性值。
- 系统已有的估值器:
①IntEvaluator:针对整型属性
②FloatEvaluator:针对浮点型属性
③ArgbEvaluator:针对Color属性自定义估值器
首先,定义一个Point类,如下所示:
public class Point {float x;float y;public Point(){}public Point(float x,float y){this.x = x;this.y = y;}}
Point 类非常简单,x和y两个变量用于记录坐标的位置,并且提供了两个构造方法。
接下来自定义估值算法,来告知系统如何实现初始对象到结束对象的过度(对于插值器来说,我们就使用系统的线性插值器即可,无须自定义):
import android.animation.TypeEvaluator;/*** 自定义估值算法*/public class MyTypeEvaluator implements TypeEvaluator<Point> {@Overridepublic Point evaluate(float fraction, Point startValue, Point endValue) {// 参数说明// fraction:表示动画完成度(根据它来计算当前动画的值),也是插值器getInterpolation()的返回值// startValue:动画的初始值// endValue:动画的结束值// 估值器的计算逻辑...// 返回对象动画过渡逻辑计算后的值// 即赋给动画属性的具体数值// return value;Point point = new Point();point.x = 200 * (fraction * 1.5f); //fraction * 1.5f就是时间,fraction代表时间流逝的百分比,1.5代表1500ms即1.5spoint.y = 200 * (fraction * 1.5f) * (fraction * 1.5f);return point;}}public void hello(View view){//设置自定义的TypeEvaluator,起始属性ValueAnimator valueAnimator = ValueAnimator.ofObject(new MyTypeEvaluator(), new Point(0, 0));//设置持续时间valueAnimator.setDuration(1500);//设置线性时间插值器valueAnimator.setInterpolator(new LinearInterpolator());valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {Point point = (Point) animation.getAnimatedValue();mBlueBall.setX(point.x);mBlueBall.setY(point.y);Log.e("TAG",point.x+":"+point.y);}});valueAnimator.start();}
