【问题标题】:Using Float value in ValueAnimator causes Exception在 ValueAnimator 中使用浮点值会导致异常
【发布时间】:2017-06-22 09:18:34
【问题描述】:

我正在尝试对数字从零到第 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();

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

【问题讨论】:

标签: java android android-animation


【解决方案1】:

在我看来,您在滥用 ValueAnimator。

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

此代码应该适用于您的情况。我更改了更新侦听器以将文本设置为动画值,以便您的 ValueAnimator 实际执行某些操作。我认为每次动画师更新时将文本设置为“100.2”没有多大意义,因为用户不会看到任何变化,尽管无论如何您可能对 UpdateListener 有其他计划。

或者,您可以修复 Evaluator 以评估浮点数而不是整数。

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

截断动画值

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

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 侦听器中,然后您可以接收到动画值的截断值到小数点后一位。

【讨论】:

  • 您好,这是可行的,但在动画期间,ValueAnimator 会遍历 8 个小数点,然后以 100.2 结束。例如,它贯穿 0.123456 并递增直到 100.2。无论如何要将其限制为 1 个小数点?
  • 是的@RickGrimesTheCoder 我已经在我的答案中添加了代码来回答你的问题,希望这就是你要找的!
  • 谢谢亚历克斯!感谢您的支持
  • np,很乐意提供帮助。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多