持续创作,加速成长!这是我参与「掘金日新计划 · 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就可以写出自定义的估值器了。