ValueAnimator学习过程了解了一些常用方法,自己简单做份笔记备忘:
之前一开始看4.0的apidemo 的动画范例时,一开始接触到的是ObjectAnimator,所以先入为主的理解ValueAnimator既然是它的父类,应该也是类似的动画类。发现ValueAnimator不像ObjectAnimator那么直接定义操作对象(甚至怀疑怎么没有对象也能控制动画)。现在,我理解ValueAnimator就是一个为动画设计优化的定时器(没错,就是官方SDK上写的a simple timing engine for running animations)。用定时器来理解就比较容易感觉没有对象也是可以的。因为关联上对象后,自然就是动画了。
先把自己看到的简单直观的方法罗列出:
ValueAnimator.setDuration(int) 设定动画时长,单位ms
ValueAnimator.setTaget(Object) 设定动画对象,如ImageView
ValueAnimator.clone() 复制一份完全一样的动画,一般配合setTarget修改被复制动画的关联对象
1.ValueAnimator.addUpdateListener(实现ValueAnimator.AnimatorUpdateListener的类)
这句如果不加,ValueAnimator或是AnimatorSet.start时改动画对象不能播放
为什么?对照机制图如下:
ValueAnimator会自动按时getAnimatedValue()取要改变属性的值,再复制给property让系统自动更新动画对象的相应属性刷新显示。
需要注意的是,若所有Animator用同一个UpdateListener对象,只要其中一个Animator有addUpdateListener,则所有动画以它的Duration长度来更新自己相应动画时间段播放内容。很绕#@U&~
举个例子,动画A\B, A从x=0->x=10,duration:1000 B从x=0->x=9,duration:3000(都是线性动画) A.addUpdateListener,B没有. A\B同时播放后效果:动画时间只有1秒。A从x=0->x=10,B从x=0->x=3仅整个动画的1/3时间。
2.ValueAnimator.ofFloat(Float... Value)
这个方法主要就记录下,可变参数Float... Value之我的理解。一般常用设定(0f,1f),意味着动画对象的属性值再全程起始值从0~1。简单直观的理解如下图:
下图对应的ofFloat(0f,40f).setDuration(40),没有新定义TimeInterpolator和TypeEvaluator
3.ValueAnimator.setInterpolator(继承Interpolator的类)
这个方法就是给动画对象设置Interpolator(我翻译为 补间控制器),做过Flash动画或者早期安卓Tween动画时,都有翻译用到 补间 这个词,或者理解为动画的变化率。具体理解我也说不清,也不想直接翻译SDK,太枯燥。这里想谈的是Interpolator要自定义时需要实现接口的哪些方法。
这里给一个简单的实现Interpolator接口的类:
import android.view.animation.Interpolator;
public class MyInterpolator implements Interpolator {
private float mFactor;
private int i;
public MyInterpolator(int i){
this.i = i;
}
@Override
public float getInterpolation(float input) {
switch(i){
case 1:mFactor = input;
break;
case 2:mFactor = input*input*input;
break;
}
return mFactor;
}
}
当初始变量为1的时候,mFactor = input,是一个线性函数,“变化率”是匀速的
当初始变量为2的时候,mFactor = input*input*input,是一个曲线函数,“变化率”呈三次方。
这里需要注意的是,input是一个0.0f~1.0f的浮点类型
从上面看来,自定义一个Interpolator就是用input根据所需构造一个函数出来,而input是系统根据动画时间/动画总时长自动输出的一次线性函数变量,我们没法改变。但是可以在重写getInterpolation方法里实现自定义的函数,return需要的函数值就可以。
4.AnimatorSet.playTogether(Animator... obj)
同时播放若干个Animator动画。需要提醒的是在AnimatorSet.start()时,并非所有动画都重置后重新开始播放,仅第一个动画会重置到初始状态重新播放,其余动画在第一个动画未走完前忽略.start()待第一个动画播放完,才能触发重新播放。