安卓仿余额宝的资产数字跳动的动画效果
因为是金融类的app,需求是想要实现总资产数字跳动的动画展示效果,这个需求本身没有什么难度,无非是使用属性动画来实现(优化前):
ValueAnimator animator = ValueAnimator.ofInt(mStartValue, mEndValue);
animator.setDuration(duration);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mTextView.setText(animation.getAnimatedValue().toString());
}
});
animator.start();
即通过ValueAnimator.ofInt()或者ofFloat()来实现从mStartValue到mEndValue的数字自增长动画,但是会有一个问题,就是当资产超过int或者float的范围后,展示的数字就会有问题,所以必须进行自定义,如下:
自定义的实现效果(优化后)
private void initRiseNumber(final TextView textView, final String total) {
mAnimator = ValueAnimator.ofObject(new DoubleTypeEvaluator(), 0.00, new BigDecimal(total).doubleValue());
mAnimator.setDuration(1500);
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
String number = String.valueOf(animation.getAnimatedValue());
DecimalFormat df = new DecimalFormat(",##0.00");
textView.setText(df.format(new BigDecimal(number)));
}
});
mAnimator.start();
}
/**
* 自定义的TypeEvaluator
*/
class DoubleTypeEvaluator implements TypeEvaluator<Double> {
@Override
public Double evaluate(float fraction, Double startValue, Double endValue) {
return startValue + fraction * (endValue - startValue);
}
}
通过DoubleTypeEvaluator()通过自定义double类型的TypeEvaluator,因双精度的数值范围更大,所以不会出现文章开始的精度问题。