我试图使一个数从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();

我需要做哪些更改才能使此操作适用于浮点值?谢谢!

最佳答案

在我看来你误用了ValueAnimator。
使用值animator的一个更简单的方法是使用ValueAnimator.ofFloat(float... values)这将自动为您设置求值器。在您的代码中,您正在向整数求值器提供浮点值,从而导致强制转换异常。

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就可以实际执行一些操作。我不认为每次动画更新时都将文本设置为“100.2”有什么意义,因为用户不会看到任何更改,尽管您可能对updateListener有其他计划。
或者,您可以将求值器修复为计算浮点数而不是整数。
animator.setEvaluator(new TypeEvaluator<Float>() {
    @Override
    public Float evaluate(float fraction, Float startValue, Float endValue) {
        return (startValue + (endValue - startValue) * fraction);
    }
});

截断动画值
如果您希望将递增值限制在小数点后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侦听器中,然后可以将动画值的截断值设置为小数点后一位。

关于java - 在ValueAnimator中使用Float值会导致异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44695239/

10-10 02:13