2017-06-22 40 views
1

我正在尝试动画从零到第n个数字的数字的增量行为。 ValueAnimator适用于整数值,但我试图用浮点值来解决这个问题,并使用ClassCastException崩溃。在ValueAnimator中使用浮点值会导致异常

例外:

java.lang.ClassCastException:java.lang.Float中不能转换为java.lang.Integer中

代码:

ValueAnimator animator = new ValueAnimator(); 
animator.setObjectValues(0, 100.2f); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
       public void onAnimationUpdate(ValueAnimator animation) { 
        tvTotalAmount.setText("100.2"); 
       } 
      }); 
animator.setEvaluator(new TypeEvaluator<Integer>() { 
       public Integer evaluate(float fraction, Integer startValue, Integer endValue) { 
        return Math.round(startValue + (endValue - startValue) * fraction); 
       } 
      }); 
animator.setDuration(1500); 
animator.start(); 

我需要做些什么才能使这项工作适用于浮点值?谢谢!

+0

您是否尝试过使用FloatEvaluator而不是TypeEvaluator? https://developer.android.com/reference/android/animation/FloatEvaluator.html – khriskooper

+0

animator.setEvaluator()使用Float而不是Integer。 –

回答

2

在我看来,你是滥用ValueAnimator更换TypeEvaluator。

使用Value Animator的更简单的方法是使用ValueAnimator.ofFloat(float... values)这将自动为您设置Evaluator。在你的代码中,你将浮点值提供给Integer Evaluator,从而导致抛出异常。

ValueAnimator animator = ValueAnimator.ofFloat(0f, 100.2f); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      public void onAnimationUpdate(ValueAnimator animation) { 
       tvTotalAmount.setText(String.valueOf((float)animation.getAnimatedValue())); 
      } 
     }); 
animator.setDuration(1500); 
animator.start(); 

此代码应该适合您的情况。我更改了更新侦听器,将文本设置为animatedValue,以便您的ValueAnimator实际执行某些操作。虽然你可能有更多的UpdateListener计划,但我并不认为每次动画师更新时都会将文本设置为“100.2”,因为用户看不到任何更改。

或者,您可以修复您的评估程序以评估Floats而不是整数。

animator.setEvaluator(new TypeEvaluator<Float>() { 
    @Override 
    public Float evaluate(float fraction, Float startValue, Float endValue) { 
     return (startValue + (endValue - startValue) * fraction); 
    } 
}); 

截断animatedValue

如果你想增加值限制为仅1位小数,我建议这样做:你onAnimationUpdate侦听器内

DecimalFormat df = new DecimalFormat("###.#"); 
df.setRoundingMode(RoundingMode.DOWN); //DOWN if you dont want number rounded, UP if you do want it rounded 
float oneDecimal = df.format((float)animation.getAnimatedValue()); 

将此代码和然后您可以将动画值的截断值保存到一位小数位。

+0

嗨,这个作品,但在动画,ValueAnimator迭代通过8小数点,然后结束它在100.2。例如,它运行通过0.123456并增加tilll 100.2。无论如何限制这个1小数点? – Dinuka

+0

是@RickGrimesTheCoder我添加了代码给我的答案来回答你的问题,希望这是你正在寻找的! –

+0

谢谢亚历克斯!我很欣赏支持 – Dinuka

1

试试这个可能会帮助你。这个对我有用。 尝试用TypeEvaluator

animator.setEvaluator(new TypeEvaluator<Float>() { 
     @Override 
     public Float evaluate(float fraction, Float startValue, Float endValue) { 
      return (startValue + (endValue - startValue) * fraction); 
     } 
    });