1. 作用:根据当前属性改变的百分比来计算改变后的属性值。
  2. 系统已有的估值器:
    ①IntEvaluator:针对整型属性
    ②FloatEvaluator:针对浮点型属性
    ③ArgbEvaluator:针对Color属性

    自定义估值器

首先,定义一个Point类,如下所示:

  1. public class Point {
  2. float x;
  3. float y;
  4. public Point(){}
  5. public Point(float x,float y){
  6. this.x = x;
  7. this.y = y;
  8. }
  9. }

Point 类非常简单,x和y两个变量用于记录坐标的位置,并且提供了两个构造方法。

接下来自定义估值算法,来告知系统如何实现初始对象到结束对象的过度(对于插值器来说,我们就使用系统的线性插值器即可,无须自定义):

  1. import android.animation.TypeEvaluator;
  2. /**
  3. * 自定义估值算法
  4. */
  5. public class MyTypeEvaluator implements TypeEvaluator<Point> {
  6. @Override
  7. public Point evaluate(float fraction, Point startValue, Point endValue) {
  8. // 参数说明
  9. // fraction:表示动画完成度(根据它来计算当前动画的值),也是插值器getInterpolation()的返回值
  10. // startValue:动画的初始值
  11. // endValue:动画的结束值
  12. // 估值器的计算逻辑
  13. ...
  14. // 返回对象动画过渡逻辑计算后的值
  15. // 即赋给动画属性的具体数值
  16. // return value;
  17. Point point = new Point();
  18. point.x = 200 * (fraction * 1.5f); //fraction * 1.5f就是时间,fraction代表时间流逝的百分比,1.5代表1500ms即1.5s
  19. point.y = 200 * (fraction * 1.5f) * (fraction * 1.5f);
  20. return point;
  21. }
  22. }
  23. public void hello(View view){
  24. //设置自定义的TypeEvaluator,起始属性
  25. ValueAnimator valueAnimator = ValueAnimator.ofObject(new MyTypeEvaluator(), new Point(0, 0));
  26. //设置持续时间
  27. valueAnimator.setDuration(1500);
  28. //设置线性时间插值器
  29. valueAnimator.setInterpolator(new LinearInterpolator());
  30. valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  31. @Override
  32. public void onAnimationUpdate(ValueAnimator animation) {
  33. Point point = (Point) animation.getAnimatedValue();
  34. mBlueBall.setX(point.x);
  35. mBlueBall.setY(point.y);
  36. Log.e("TAG",point.x+":"+point.y);
  37. }
  38. });
  39. valueAnimator.start();
  40. }