前言
这几天项目有个特效需要实现,具体的要求就是在规定时间内完成金额从0到N的展示,由于项目比较紧张,所以就找了个三方控件来实现。但是三方控件毕竟不是自己的,所以在完成项目所需效果之后还是有必要自己研究一下的。先看一下效果图:
我实现这种效果主要用到了ValueAnimator,不过在数值变化方面由于系统的ValueAnimator只提供了ofInt和ofFloat两种方式,这两种方式在精度控制方面都无法满足需求。所以需要我们使用另外一种方式ofObject结合自定义TypeEvaluator来实现。
实现步骤
1 自定义TypeEvaluator
自定义TypeEvaluator 命名为MyTypeEvaluator,由于TypeEvaluator是一个接口,所以我们要实现TypeEvaluator并且重写evaluate方法。
MyTypeEvaluator需要指定一个泛型类型,由于最终展示的效果需要保留两位小数,所以使用Double作为泛型类型。具体代码如下
class MyTypeEvaluator implements TypeEvaluator<Double>{
@Override
public Double evaluate(float fraction, Double startValue, Double endValue) {
double value=startValue+fraction*(endValue-startValue);
return value;
}
evaluate返回对startvalue和endvalue进行线性插值的运算结果其中,fraction表示开始值和结束值的比例,计算公式:result = startValue + fraction * (endvalue - startvalue) 。startvalue和endvalue就是在ofObject中设置的开始和结束参数值
2 ofObject和自定义TypeEvaluator结合
ValueAnimator animator = ValueAnimator.ofObject(myTypeEvaluator,0.00,500.10);
// ValueAnimator animator = ValueAnimator.(0.00,500.10);
animator.setDuration(5000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
DecimalFormat format=new DecimalFormat("#0.00");
//
tv_num.setText(format.format(animation.getAnimatedValue())+"");
}
});
animator.start();
startvalue 0;
end value 500.10
动画时长5s
为animator添加addUpdateListener监听,这个监听主要用来监听动画执行过程中的数值变化情况。重写onAnimationUpdate方法并且为控件赋值,animation.getAnimatedValue()可以获取到变化之后的数值。