动画第三步->ValueAnimator:自定义Evaluator

极客学院Animation教程讲解的很详细,点击进入哦

这里为学习的整理和补充O(∩_∩)O

一、秒懂Evaluator概念

看图⬇️

引用自http://wiki.jikexueyuan.com/project/android-animation/5.html

是不是非常简单明了?还记得 上一篇的表达式( 位置=开始值+(结束值-开始值)*进度)么?这个表达式就是在Evaluator计算的哦,由此,可以这样认为, Evaluator 是根据插值器返回的进度转换成当前位置所对应的值

二、IntEvaluator &FloatEvaluato的使用

  • 首先要注意这一点:

只有在动画数值类型一样时,所对应的 Evaluator 才能通用。所以 ofInt()对应的 Evaluator 类名叫 IntEvaluator,而 ofFloat()对应的 Evaluator 类名叫 FloatEvaluator; 在设置 Evaluator 时,是通过 animator.setEvaluator()来设置的

  • 直接上代码O(∩_∩)O
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400);
valueAnimator.setDuration(3000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        int curValue = (int) animation.getAnimatedValue();
        view.layout(curValue, curValue, curValue + view.getWidth(), curValue + view.getHeight());
    }});
//设置Evaluator
valueAnimator.setEvaluator(new IntEvaluator());
valueAnimator.start();
  • ** 一起揭开IntEvaluator的庐山真面目**
/**
*This evaluator can be used to perform type interpolation between int values. 
*/
public class IntEvaluator implements TypeEvaluator { 
    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
        int startInt = startValue; 
       return (int)(startInt + fraction * (endValue - startInt));    
}}

是不是和我们的表达式逻辑一模一样,哈哈
既然如此,就来自定义Evalutor,自己写表达式吧<( ̄︶ ̄)↗[GO!]

三、自定义IntEvalutor

  • 还是直接上代码(其实,就是仿写IntEvaluator哦)
public class MyEvaluator implements TypeEvaluator {
    @Override
    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
        int startInt = startValue;
        return (int)(endValue-(endValue-startInt)*fraction);
    }}

调用MyEvaluator

......
valueAnimator.setEvaluator(new MyEvaluator());
......

该例子得到的效果是:从终点移动到起点O(∩_∩)O~

四、使用和自定义ArgbEvalutor

  • 老样子,上代码
//控制颜色变化,实现view的背景色从透明红色->不透明蓝色变化
ValueAnimator valueAnimator = ValueAnimator.ofInt(0x00ff0000, 0xff0000ff);
 //argbvalue
Animator.setDuration(3000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        int curValue = (int) animation.getAnimatedValue();
        view.setBackgroundColor(curValue);
    }});
valueAnimator.setEvaluator(new ArgbEvaluator());
valueAnimator.start();
  • 揭开ArgbEvaluator神秘面纱,吼吼
/** 
This evaluator can be used to perform type interpolation between integer * values that represent ARGB colors. 
*/
public class ArgbEvaluator implements TypeEvaluator {
    private static final ArgbEvaluator sInstance = new ArgbEvaluator();
    public Object evaluate(float fraction, Object startValue, Object endValue) {
        int startInt = (Integer) startValue;
        int startA = (startInt >> 24) & 0xff;
        int startR = (startInt >> 16) & 0xff;
        int startG = (startInt >> 8) & 0xff;
        int startB = startInt & 0xff;
        int endInt = (Integer) endValue;
        int endA = (endInt >> 24) & 0xff;
        int endR = (endInt >> 16) & 0xff;
        int endG = (endInt >> 8) & 0xff;
        int endB = endInt & 0xff;
        return (int)((startA + (int)(fraction * (endA - startA))) << 24) |
                (int)((startR + (int)(fraction * (endR - startR))) << 16) |
                (int)((startG + (int)(fraction * (endG - startG))) << 8) |
                (int)((startB + (int)(fraction * (endB - startB))));
    }}

>>n表示带符号右移,<<代表左移,&是与,这里就不做过多叙述咯(如果忘记的话,就查一下二进制的运算吧)

  • 自定义ArgbEvaluator
  • 还是直接上代码(*其实,就是仿写ArgbEvaluator *)
public class MyEvaluator implements TypeEvaluator {
    @Override
    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
        int startInt = startValue;
        return (int)(endValue-(endValue-startInt)*fraction); 
   }}

后记:

Evaluator也结束了,所谓得数学者,得Evaluator是也~

你可能感兴趣的:(动画第三步->ValueAnimator:自定义Evaluator)