Android开发-动画 属性动画(Attribute Animation)之 ObjectAnnimator

234 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

前面我们介绍了属性动画的第一种类型ValueAnimator,它是通过不断的修改对象的属性值来实现动画的效果,通过addUpdateListener的方法回调,获取时间因子,在不同的时间因子里添加不同的动画效果,完成动画渲染,同时也提供了插值器来改变动画执行的效果,速度,以及表现形态,下面我们介绍第二种属性动画的ObjectAnnimator,它区别于ValueAnimator,通过直接改变对象的属性值来实现动画的效果。

ObjectAnnimator 的定义以及属性

ObjectAnnimator动画效果是直接对对象的属性值进行改变操作,从而实现动画效果,ObjectAnimator继承自ValueAnimator,所以ValueAnimator所能使用的方法,ObjectAnimator都可以使用。

对于ObjectAnnimator的动画定义,需要简单描述下,它不像ValueAnimator可以直接使用方法去实现各种动画效果,类似我们上篇文章中介绍的setTranslationX方法,它是通过反射找到对应控件的函数,拿到对应的属性值,比如平移动画,它就需要用的setTranslationX的后半部分,也就是TranslationX,那么平移动画的属性值就是“translationX”,以此类推,我们把ObjectAnnimator用到的几个常用的动画属性列举下:

1)alpha:渐变动画;
2)scaleX/scaleY:缩放动画;
3) translateX/translateY:位移动画;
4) rotation:旋转动画

知道了ObjectAnnimator动画的属性值,那么就开始实现简单的动画效果吧。

public class MainActivity extends Activity {

 
    private ObjectAnnimator objectAnnimator;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //ImageView对象
        iv_anim = (ImageView) findViewById(R.id.image_anim);
        
    }

    private void translation(){
        objectAnnimator = ObjectAnimator.ofFloat(iv_anim, "translationX", 0, 100);
        animator.setDuration(2000); 
        animator.start();
    
    }
}

这样就实现了和ValueAnimator 一样的平移动画效果了。用法上相对来说是不是更简单了,也更模糊了,怎么说呢,因我们不够具体了,比如你想设置一个背景色变化的动画,就得知道它的属性值。比如TextView,如果想改变它的背景色,我知道它的方法是setBackgroundColor,那对应的属性值就是backgroundColor,所以想改变TextView的背景色,展现动画的效果,就得这样写:

 ObjectAnimator objectAnimator = ObjectAnimator.ofInt(tv,"backgroundColor",0xffff0000,0xff4181d1,0xffff8891,0xfff4f943);
        objectAnimator.setDuration(2000);
        objectAnimator.setEvaluator(new ArgbEvaluator());
        objectAnimator.start();

setEvaluator是ObjectAnnimator的估值器,这里用到的是色值估值器。系统自带的只有3种,分别是IntEvaluator 、FloatEvaluator 、ArgbEvaluator,和插值器一样,估值器也是支持自定义的,只要继承TypeEvaluator就可以写出自定义的估值器了。