· 属性动画与view动画的不同之处
view动画系统提供了仅动画View 对象的能力,所以如果你想动画非View 对象,你就要自己实现代码。 view动画系统实际上还被强制仅能对 View 的少数属性进行动画,比如缩放和旋转,而不能对背景色进行。
view动画的另一个坏处是它仅修改View的绘制位置,而不是View的实际位置。例如,如果你动画一个移动穿越屏幕,button的绘制位置是正确的,但实际你可以点击它的位置却没有变,所以你必须去实现你自己的逻辑来处理它。
使用属性动画系统时,这个限制被完全解除了,并且你可以动画任何对象的任何属性(View或非View)并且对象本身也会实际上被修改。并且属性动画系统本身对动画的支持也更有力度。在高层,你分配动画到要动画的属性上,比如颜色,位置、或大小然后定义动画的参数比如插值算法以及多个动画的同步。
然而,view 动画系统只需要少量时间来设置并且不需要太多的代码。如果view动画完全满足你的需求,或在你的旧代码中能按你想的工作,那么就不需要使用属性动画系统。也有可能在某些情况下需要同时用到这两种动画系统。
· API 概览
你可以在 android.animation找到大部分的属性动画系统的API。因为view动画系统已经在android.view.animation定义了很多插值算法,你也可以在属性动画系统中使用它们。下面的表中描述了属性动画系统的主要组成。
Animator 类提供了创建动画的基础。你一般不应直接使用此类,因为它仅提供了最少的功能。下面的子类们都是从Animator派生的。
表 1. Animators
类 |
描述 |
ValueAnimator |
属性动画的主要基类。它计算要动画的属性的值。它具有所有计算动画的值的核心函数,它包含每次动画的时间信息、是否重复播放、接收更新事件的监听器等参数,还能设置如何计算自定义类型。动画一个属性要做两条:计算动画的值和设置这些值到对象或属性上。ValueAnimator 不负责第二条,所以你必须侦听ValueAnimator对值的更新然后按你的逻辑在修改你要动画的对象。 |
ObjectAnimator |
ValueAnimator 的一个子类。允许你设置要动画的目标对象和对象的属性。此类会在计算出动画的新值时更新属性。大多数时候你应选择使用ObjectAnimator ,因为用它处理对象的动画更加容易。然而,你某些时候可能想直接使用ValueAnimator ,因为ObjectAnimator 具有很多限制,比如需要对象具有特定的操作器方法。 |
AnimatorSet |
提供了一个控制动画组中动画关系的机制。你可以设置多个动画一起播放、分别播放、或延迟播放。 |
Evaluator告诉属性动画系统如何计算某个属性的值。它们跟据Animator 类提供的时间信息,动画的开始值和结束值计算动画的值。属性动画系统提供了以下evaluator:
表 2. Evaluator们
Class/Interface |
Description |
IntEvaluator |
计算int 型属性的默认evaluator。 |
FloatEvaluator |
计算float型属性的默认 evaluator。 |
ArgbEvaluator |
计算用十六进制值表示的颜色属性的默认evaluator 。 |
TypeEvaluator |
一个允许你创建自己的evaluator的接口。如果你要动画的对象的属性非int, float、或color,你就必须实现TypeEvaluator 接口来定义如何计算对象属性的动画值。如果你想改变处理int, float, 和 color属性的默认行为,你也可以为它们指定自定义的TypeEvaluator 。 |
时间插值器定义了时间函数如何计算动画的值。例如,你可以指定动画过程是线性的发生,这表示动画均匀的运动;或者指定非线性的时间,例如, 开始时加速,结束时减速。表 3 描述了在android.view.animation中的插值器们。如果现有的插值器不能满足你,你可以实现接口TimeInterpolator 来创建你自己的插值器。
Table 3. 插值器们
类/接口 |
描述 |
AccelerateDecelerateInterpolator |
中间快两头慢的插值器。 |
AccelerateInterpolator |
一直加速的插值器。 |
AnticipateInterpolator |
先向后再猛向前的插值器。 |
AnticipateOvershootInterpolator |
先向后,再猛向前,超过结束值后再回到结束值的插值器。 |
BounceInterpolator |
最后跳一下的插值器。 |
CycleInterpolator |
重复循环播放的插值器。 |
DecelerateInterpolator |
一直减速的插值器。 |
LinearInterpolator |
定速播放的插值器。 |
OvershootInterpolator |
先猛向前直到超过结束值然后再回到开始值的插值器。 |
TimeInterpolator |
让你能实现自己的插值器的接口。 |