ValueAnimator用于Android TextView上的计数效果

时间:2016-09-14 08:58:38

标签: java android textview android-animation animator

我正在尝试在TextView中为这样的双值创建一个cout-up效果:

ValueAnimator animator = new  ValueAnimator();
animator.setObjectValues(0, 50.5); //double value
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    public void onAnimationUpdate(ValueAnimator animation) {
                textView.setText(String.valueOf(animation.getAnimatedValue()));
            }
        });
animator.setEvaluator(new TypeEvaluator<Double>() { // problem here
   @Override
   public Double evaluate(float fraction, Double startValue, Double endValue) {
      return  (startValue + (endValue - startValue) * fraction);
           }
        });
animator.setDuration(3000);
animator.start();// problem here

它给了我这个: java.lang.ClassCastException:java.lang.Integer不能强制转换为 animator.setEvaluator(new TypeEvaluator()<行中的java.lang.Double / strong>在 animator.start();

如果我使用count up来表示整数并实现TypeEvaluator方法,那么它可以工作。为什么不换双人?

2 个答案:

答案 0 :(得分:3)

这里发生了 ClassCastException ,因为赋值器的返回类型是double。但是在return语句中进行了一些算术运算,其中float( fraction )值乘以double值( endValue - startValue ),其中编译器感到困惑,因为它不知道将返回哪个值。而是强制类型为(endValue - startValue)* fraction 加倍。修改后代码应该看起来像

ValueAnimator animator = new  ValueAnimator();
    animator.setObjectValues(0d, 50.5d); //double value
    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    public void onAnimationUpdate(ValueAnimator animation) {
                textView.setText(String.valueOf(animation.getAnimatedValue()));
                }
            });
    animator.setEvaluator(new TypeEvaluator<Double>() { // problem here
       @Override
       public Double evaluate(float fraction, Double startValue, Double endValue) {
          return  (startValue + (double)((endValue - startValue) * fraction));
               }
            });
    animator.setDuration(3000);
    animator.start();

答案 1 :(得分:3)

此行中的

animator.setObjectValues(0, 50.5); 0视为int

将此行更改为

animator.setObjectValues(0d, 50.5d); //双值