欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android动画知识回顾--ValueAnimator属性动画

程序员文章站 2022-05-04 20:02:12
...

ValueAnimator属性动画学是学了,代码也能写出了,但是让我自己讲一讲就嘿嘿嘿,主要是脑子有点乱,先说下我个人对ValueAnimator的理解。

就ValueAnimator类来说,我们常用的主要有三个方法:


public static ValueAnimator ofInt(int... values)
public static ValueAnimator ofFloat(float... values)
public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values);

简单使用最主要的还是要和AnimatorUpdateListener搭配着

ValueAnimator animator = ValueAnimator.ofFloat(0f,400f,50f,300f);
animator.setDuration(3000);
 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        Float curValueFloat = (Float)animation.getAnimatedValue();
        int curValue = curValueFloat.intValue();
        tv.layout(curValue,curValue,curValue+tv.getWidth(),curValue+tv.getHeight());
    }
});
animator.start();

设置监听器调用getAnimatedValue()方法获取返回值,对目标View进行动画操作。

但是有些情况就不行了 比如你要操作字符变换,或者系统提供测插值器无法做到你要的效果,这时候就需要我们定制Interpolator(插值器:决定动画的变化模式,线性运动和非线性运动)和Evaluator(估值器:决定变化中某一时刻的具体数值)了。详细细节请看启舰大神的博客。

我要说的是在重写Evaluator的时候,一定要注意这个方法:

public T evaluate(float fraction, T startValue, T endValue);

该方法返回值计算:startValue+ fraction * (endValue - startValue))

如果你需要float 类型还好说,无需再做任何操作,但是如果你需要的是Int类型,则返回值一定有重复的,这就需要你做优化操作,毕竟动画很消耗性能的。目前由于个人能力有限想不到如何evaluate方法内过滤重复数据,我一般都是在AnimatorUpdateListener类中getAnimatedValue()方法中过滤重复数据。如果有人有更好的想法,劳烦分享我一下,在这里先谢过了。