在ValueAnimator中使用Float值会导致异常

时间:2017-06-22 09:18:34

标签: java android android-animation

我正在尝试动画从0到第n个数字的递增行为。 ValueAnimator适用于整数值,但我尝试使用浮点值并使用ClassCastException崩溃。

例外:

  

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();

我需要做哪些更改才能使浮点值有效?谢谢!

2 个答案:

答案 0 :(得分:4)

在我看来,你是在滥用ValueAnimator。

使用Value Animator的一种更简单的方法是使用ValueAnimator.ofFloat(float... values)这将自动为您设置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实际执行某些操作。我没有看到将文本设置为&#34; 100.2&#34;每次动画师更新,因为用户看不到任何变化,尽管你可能还有其他的UpdateListener计划。

或者,您可以修复Evaluator来评估Floats而不是Integers。

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

截断animatedValue

如果您想将增加值限制为仅小数点后1位,我建议您这样做:

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());

将此代码放在onAnimationUpdate侦听器中,然后您可以将动画值的截断值接收到一个小数位。

答案 1 :(得分:2)

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

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