[置顶] android动画详解四 创建动画

· 使用ValueAnimator进行动画

通过指定一些int, floatcolor等类型的值的集合,ValueAnimator 使你可以对这些类型的值进行动画。你需通过调用ValueAnimator 的某个工厂方法来获得一个ValueAnimator 对象,比如:ofInt()ofFloat(), 或 ofObject()。例如:

ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();

此段代码中,当start()方法执行时,开始计算在1000 ms中处于01之间的动画的值。

你也可以按以下方式指定一个自定义类型来进行动画:

ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.start();

在此段代码中, ValueAnimator 在 start() 方法执行时,开始计算在1000 ms 中处于startPropertyValue 和endPropertyValue 之间的动画的值,使用MyTypeEvaluator 提供的计算逻辑。

然而,在上面代码片段中,实际上对对象没有任何影响,因为ValueAnimator 不直接操作对象或属性。你应该自己跟据所计算出的值自己修改对象。你可以定义一个监听器来处理动画过程中ValueAnimator的重要事件们,比如更新帧。当实现了监听器们,你就可以在帧刷新时通过调用getAnimatedValue()获得动画的值。

· 使用ObjectAnimator进行动画

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无效 。 

· 使用AnimatorSet组合多个动画 

 

很多情况下,你可能想播放一个动画,它的播放时机依赖于其它动画的开始时间或结束时间。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概述

你可能感兴趣的:(android,动画)