【问题标题】:ValueAnimator for count up effect on Android TextView用于 Android TextView 上的计数效果的 ValueAnimator
【发布时间】:2017-01-22 00:30:22
【问题描述】:

我正在尝试在 TextView 中为这样的 double 值制作 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 cannot be cast to java.lang.Doubleanimator.setEvaluator(new TypeEvaluator() 在 animator.start();

如果我对整数使用向上计数并实现 TypeEvaluator 方法,它就可以工作。为什么不加倍呢?

【问题讨论】:

    标签: java android textview android-animation animator


    【解决方案1】:

    animator.setObjectValues(0, 50.5); 在这行 0 中认为是int

    将此行改为

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

    【讨论】:

    • 成功了,谢谢,我没有注意 0 值!
    【解决方案2】:

    这里 ClassCastException 发生,因为求值器的返回类型是 double。但是在返回语句中进行了一些算术运算,其中浮点 (fraction) 值乘以双值(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();
    

    【讨论】:

    • 在 (endValue - startValue) * 前面添加 (double) 部分是多余的,因为检查报告的是双精度值
    • 像 (double)((endValue - startValue) * fraction) 一样将乘积转换为双倍
    • 还是一样的东西,还是多余的,问题是setObjectValues的0后面忘记加d了。
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 2012-04-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多