- 作用:根据当前属性改变的百分比来计算改变后的属性值。
- 系统已有的估值器:
①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> {
@Override
public 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.5s
point.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() {
@Override
public 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();
}