每天记录学习的新知识 : ObjectAnimator 基础和用法

概念: ObjectAnimator派生自ValueAnimator,所以ValueAnimator能用的方法,ObjectAnimator都能用, ObjectAnimator 是ValueAnimator的子类。
ObjectAnimator覆写了父类的几个方法,如ofInt(),ofFloat(),ofArgb()等。ofFloat()一般更常用,因为变化值能更加精确。
它和ValueAnimator同样也是首先设置初始值、结束值和动画时长,但是同时也绑定了目标控件和属性然后通过加速器返回当前的进度的,再经过Evaluator根据进度计算出具体的值,最后根据属性拼接set函数并反射调用,并将当前值作为参数传入,实现动画。
API:

public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)

第一个参数是作用的view,
第二个参数是属性,包括alpha(透明度),rotation(旋转角度),translationX(位置横坐标变化),translationY(位置纵坐标变化),scaleX(水平尺寸变化),scaleY(垂直尺寸变化)等。只要是View能够通过get或者set方法进行修改的属性都可以做为第二个参数。
第三个参数是一个长度可变的数组,用于存储属性的变化范围。可以不限制个数 的添加。
比如透明度变化:
如果从0F到1F再到0F,就说明由完全透明变成完全不透明再变成完全透明。
表示为ObjectAnimator animator=ObjectAnimator.ofFloat(imageView,“alpha”,0F,1F,0F);
setDuration()

设置该动画的持续时间
start()

表示启动动画。实际上执行的是一个异步的过程。
上面三句也可以直接写成
ObjectAnimator.ofFloat(imageView,“alpha”,0F,1F).setDuration(6000).start();
ofPropertyValuesHolder()

针对同一个对象进行动画。可以多动画执行。
三个参数分别是动画作用的View,以及动画的效果。
多动画执行: 同时展示多种动画效果(多个属性同时发生法改变),调用start()方法之后,实际上执行的是一个异步的过程。
因此,所有的效果会一起执行。这是一个View对象的多个动画同时执行。
ObjectAnimator.ofFloat(imageView,"rotation",0F,360F).setDuration(3000).start(); //旋转360 ObjectAnimator.ofFloat(imageView,"translationX",0F,200F).setDuration(3000).start(); //平移200 ObjectAnimator.ofFloat(imageView,"translationY",0F,200F).setDuration(3000).start(); //平移200

以上动画表示ImageView在这3秒内旋转360度,同时位移也发生变化。
ObjectAnimator.ofFloat(imageView1,"rotation",0F,360F).setDuration(3000).start(); ObjectAnimator.ofFloat(imageView2,"translationX",0F,200F).setDuration(3000).start(); ObjectAnimator.ofFloat(imageView2,"translationY",0F,200F).setDuration(3000).start();

以上动画表示ImageView1旋转360度,ImageView2位移发生变化同时执行。
PropertyValuesHolder p1=PropertyValuesHolder.ofFloat("rotation",0F,360F); PropertyValuesHolder p2=PropertyValuesHolder.ofFloat("translationX",0F,200F); PropertyValuesHolder p3=PropertyValuesHolder.ofFloat("translationY",0F,200F); ObjectAnimator.ofPropertyValuesHolder(imageView,p1,p2,p3).setDuration(3000).start();

【每天记录学习的新知识 : ObjectAnimator 基础和用法】以上动画表示ImageView在这3秒内旋转360度,同时位移也发生变化。
优化了ObjectAnimator的用法,能达到同样的效果,但是体验更好。
(可以不用重复调用setDuration()以及start()方法)。
注意:这个方法只能针对同一个对象进行动画。
AnimatorSet : 使用AnimationSet实现多属性展示动画的效果(把所有的Animation对象都塞入到AnimatorSet中),用于将所有动画放在集合中,也可以调整动画的播放顺序。
AnimatorSet set=new AnimatorSet(); ObjectAnimator animator1=ObjectAnimator.ofFloat(imageView,"rotation",0F,360F); ObjectAnimator animator2=ObjectAnimator.ofFloat(imageView,"translationX",0F,200F); ObjectAnimator animator3=ObjectAnimator.ofFloat(imageView,"translationY",0F,200F); set.playTogether(animator1,animator2,animator3);

以上动画1,2,3同时执行。动画表示在这3秒内旋转360度,同时位移也发生变化。
set.playSequentially(animator1,animator2);

以上动画按照顺序执行,先执行1,再执行2。动画表示在这3秒内先旋转再平移。
set.play(animator2).with(animator3); set.play(animator1).after(animator2);

以上表示2和3同时执行,在2之后执行1(即2和3同时执行完成之后,再执行1)。
set.play(animator2).with(animator3); set.play(animator1).before(animator2);

以上表示1在2之前执行。
set.setDuration(3000); set.start();

以上设置执行时间,开始执行。
动画监听事件: AnimatorListenerAdapter:
ObjectAnimator animator1=ObjectAnimator.ofFloat(imageView,"alpha",0F,1F); animator1.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); Toast.makeText(ProgressActivity.this, "动画结束", Toast.LENGTH_SHORT).show(); } }); animator1.setDuration(6000); animator1.start();

Animator.AnimatorListener():
ObjectAnimator animator2=ObjectAnimator.ofFloat(imageView,"alpha",0F,1F); animator2.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { //动画开始之前的处理 }@Override public void onAnimationEnd(Animator animation) { //动画结束之后的处理 Toast.makeText(ProgressActivity.this, "animator2 动画结束", Toast.LENGTH_SHORT).show(); }@Override public void onAnimationCancel(Animator animation) { //动画被取消之后的处理 }@Override public void onAnimationRepeat(Animator animation) { //动画重复的处理 } }); animator2.setDuration(6000); animator2.start();

参考:https://blog.csdn.net/zhaozhiwen6140/article/details/52026871

    推荐阅读