android动画详解四 创建动画浅析
·使用ValueAnimator进行动画
通过指定一些int,float或color等类型的值的集合,ValueAnimator使你可以对这些类型的值进行动画。你需通过调用ValueAnimator的某个工厂方法来获得一个ValueAnimator对象,比如:ofInt(),ofFloat(),或ofObject()。例如:
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f); animation.setDuration(1000); animation.start();
此段代码中,当start()方法执行时,开始计算在1000ms中处于0和1之间的动画的值。
你也可以按以下方式指定一个自定义类型来进行动画:
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue); animation.setDuration(1000); animation.start();
在此段代码中,ValueAnimator在start()方法执行时,开始计算在1000ms中处于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
·如果可以,你自己添加setter方法(废话)。
·用另外一个类封装此对象的类,于是你就有了改写权力了。在封装类中添加操作原始类的属性的setter。
·改用ValueAnimator。
·如果在ObjectAnimator的某个工厂方法中,你只指定了一个values...参数,这个参数就被视为动画的结束值。因此,你动画的对象属性必须具有一个getter方法,用于获取开始值。getter方法必须具有get
·你要动画的属性的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对象。
下面的示例代码是从例子BouncingBalls中拿来的(小改了一下下)。它以这样的方式播放下列动画对象:
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();</div>