在 ValueAnimator 中使用 Float 值会导致异常
Using Float value in ValueAnimator causes Exception
我正在尝试为数字从零到第 n 个数字的递增行为设置动画。 ValueAnimator 适用于整数值,但我尝试使用浮点值来实现它,但它因 ClassCastException
.
而崩溃
异常:
java.lang.ClassCastException: java.lang.Float cannot be cast to 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();
我需要做哪些更改才能使此功能适用于浮点值?谢谢!
试试这个可能对你有帮助。这个对我有用。
尝试用 TypeEvaluator
替换 TypeEvaluator
animator.setEvaluator(new TypeEvaluator<Float>() {
@Override
public Float evaluate(float fraction, Float startValue, Float endValue) {
return (startValue + (endValue - startValue) * fraction);
}
});
在我看来,您滥用了 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();
此代码应该适用于您的情况。我更改了更新侦听器以将文本设置为 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);
}
});
截断动画值
如果你想将递增的值限制在小数点后一位,我建议这样做:
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
侦听器中,然后您可以接收动画值的截断值到小数点后一位。
我正在尝试为数字从零到第 n 个数字的递增行为设置动画。 ValueAnimator 适用于整数值,但我尝试使用浮点值来实现它,但它因 ClassCastException
.
异常:
java.lang.ClassCastException: java.lang.Float cannot be cast to 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();
我需要做哪些更改才能使此功能适用于浮点值?谢谢!
试试这个可能对你有帮助。这个对我有用。 尝试用 TypeEvaluator
替换 TypeEvaluatoranimator.setEvaluator(new TypeEvaluator<Float>() {
@Override
public Float evaluate(float fraction, Float startValue, Float endValue) {
return (startValue + (endValue - startValue) * fraction);
}
});
在我看来,您滥用了 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();
此代码应该适用于您的情况。我更改了更新侦听器以将文本设置为 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);
}
});
截断动画值
如果你想将递增的值限制在小数点后一位,我建议这样做:
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
侦听器中,然后您可以接收动画值的截断值到小数点后一位。