通过指定一些int, float或color等类型的值的集合,ValueAnimator 使你可以对这些类型的值进行动画。你需通过调用ValueAnimator 的某个工厂方法来获得一个ValueAnimator 对象,比如:ofInt(), ofFloat(), 或 ofObject()。例如:
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();
此段代码中,当start()方法执行时,开始计算在1000 ms中处于0和1之间的动画的值。
你也可以按以下方式指定一个自定义类型来进行动画:
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.start();
在此段代码中, ValueAnimator 在 start() 方法执行时,开始计算在1000 ms 中处于startPropertyValue 和endPropertyValue 之间的动画的值,使用MyTypeEvaluator 提供的计算逻辑。
然而,在上面代码片段中,实际上对对象没有任何影响,因为ValueAnimator 不直接操作对象或属性。你应该自己跟据所计算出的值自己修改对象。你可以定义一个监听器来处理动画过程中ValueAnimator的重要事件们,比如更新帧。当实现了监听器们,你就可以在帧刷新时通过调用getAnimatedValue()获得动画的值。
ObjectAnimator 是ValueAnimator 的一个子类并且合并了时间引擎和ValueAnimator的计算能力来动画一个对象的属性,这个属性通过名字指定。这使得动画一个对象更加容易,因为你不再需要实现ValueAnimator.AnimatorUpdateListener,因为要动画的属性是自动更新的。
实例化ObjectAnimator 和实例化ValueAnimator很相似,但是你还需要指定对象和对象的属性的名字:
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f); anim.setDuration(1000); anim.start();
要使ObjectAnimator 能正确的更新属性,你必须按以下去做:
· 你要动画的对象的属性必须具有一个setter函数,像这个样子:set<propertyName>()。 因为 ObjectAnimator 在动画期间会自动更新属性,必须能通过此setter方法操作目标属性。例如,如果属性的名字是foo,你必须具有一个setFoo()方法。如果此方法不存在,你有三个选择:
· 如果可以,你自己添加setter方法(废话)。
· 用另外一个类封装此对象的类,于是你就有了改写权力了。在封装类中添加操作原始类的属性的setter。
· 改用 ValueAnimator。
· 如果在ObjectAnimator 的某个工厂方法中,你只指定了一个values...参数,这个参数就被视为动画的结束值。因此,你动画的对象属性必须具有一个getter方法,用于获取开始值。getter方法必须具有get<propertyName>()样的格式。例如,如果属性名是foo,你需要带有一个getFoo()方法。
· 你要动画的属性的getter (如果需要)和setter方法处理的数据类型必须跟你为ObjectAnimator指定的开始和结束值的类型相同。例如,如果你创建如下的ObjectAnimator,你必须具有targetObject.setPropName(float)方法和targetObject.getPropName(float)方法:
ObjectAnimator.ofFloat(targetObject, "propName", 1f)
· 跟据动画的对象和属性的不同,你可能需要调用View的invalidate()方法来强制屏幕使用新的动画数据重绘自己。你应在onAnimationUpdate() 回调中这样做。例如,动画一个Drawable对象的color属性导致仅在对象重绘自己时才更新屏幕。View的所有的属性setter,比如setAlpha()和setTranslationX(),都会使View无效,所以你不需要在调用这些方法时使View无效 。
很多情况下,你可能想播放一个动画,它的播放时机依赖于其它动画的开始时间或结束时间。Android系统允许你绑定多个动画到一个AnimatorSet中,于是你可以指定是否同时播放,或分别播放,或某个延迟后再播放。你还可以相互嵌套各AnimatorSet对象。
下面的示例代码是从例子Bouncing Balls 中拿来的 (小改了一下下)。它以这样的方式播放下列动画对象:
1. 播放 bounceAnim.
2. 同时播放 squashAnim1, squashAnim2, stretchAnim1, 和 stretchAnim2 。
3. 播放 bounceBackAnim.
4. 播放 fadeAnim.
AnimatorSet bouncer = new AnimatorSet(); bouncer.play(bounceAnim).before(squashAnim1); bouncer.play(squashAnim1).with(squashAnim2); bouncer.play(squashAnim1).with(stretchAnim1); bouncer.play(squashAnim1).with(stretchAnim2); bouncer.play(bounceBackAnim).after(stretchAnim2); ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f); fadeAnim.setDuration(250); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(bouncer).before(fadeAnim); animatorSet.start();
上一篇:android动画详解三 动画API概述