属性动画是什么
属性动画(Property Animation)是在API 11之后推出的,相比于API 11之前的Tween Animation和Frame Animation,属性动画功能更加强大,效果也更丰富。
属性动画作为一个健壮的框架,它几乎允许对于任何Object做动画。无论对象有没有绘制到屏幕上,你可以定义一个属性动画来随着时间变化改变对象属性,属性动画可以在一个指定的时间长度内改变对象属性的中一个字段值,属性动画允许你定义以下几个动画的特点:
- Duration:定义动画时长,默认是300 ms。
- Time interpolation: 时间插值器,它可以指定属性值如何随时间变化的,反应了动画的运动速率。
- Repeat count and behavior: 指定当动画结束时是否重复动画以及动画重复多少次,还可以设置反向播放动画,播放到达指定次数后动画结束。
- Animator sets:把一组动画聚在一起,顺序播放或者同时播放或者延迟播放。
- Frame refresh delay:指定刷新动画帧的频率,默认时间是10ms,但是刷新频率最终取决于系统是否繁忙以及系统服务底层计时器的快慢。
为什么会有属性动画
上面的文章介绍过补间动画(Tween Animation)和帧动画(Frame Animation),为什么还要出属性动画呢?因为无论补间动画还是帧动画,都是有缺点的:
- 作用对象单一:只能作用在View上,如只需要改变某个View的corlor,无论是补间动画还是帧动画都不可行了。
- 只能改变View的视觉效果,无法改变View的属性:比如View在a位置,通过补间动画View到了b位置,那么此时点击b位置View是不响应的(假设View是可点击的VIew),因为View的真实位置扔在a位置。
- 动画效果单一:补间动画&帧动画只能实现简单的动画,复杂动画需要靠属性动画了!
Animator类提供了创建动画的基本组成,通常不直接使用这个类而是用ValueAnimator和ObjectAnimator来创建属性动画。
- Animator
Animator类的继承关系:
类 | 描述 |
---|---|
ValueAnimator | ValueAnimator是整个属性动画机制当中最核心的一个类。它使用一种时间循环的机制来计算值与值之间的动画过渡,负责管理动画的播放次数、播放模式、设置动画设置监听器、设置自定义类型等。有两块动画属性:计算动画值和设置这些对象或属性的动画。ValueAnimator不执行第二个,所以你必须设置ValueAnimator更新值和修改对象的监听。 |
ObjectAnimator | ValueAnimator的一个子类,ObjectAnimator可以对任意对象及对象属性设置动画。通常情况下,使用ObjectAnimator更多一些因为它使目标对象动画过程更简单,然而因为ObjectAnimator有更多的限制,有时候使用ValueAnimator更合理一些,比如需要特定的acessor方法出现在目标对象。 |
AnimatorSet | 把一组动画聚在一起,顺序播放或同时播放或延迟播放。 |
- Evaluators
Evaluators来告诉系统对于一个给定的属性如何来计算它的值,它们获得Animator提供的数据(动画起始值和结束值),并根据这些数据来计算动画值。
类/接口 | 描述 |
---|---|
IntEvaluator | 计算int类型的默认evaluator |
FloatEvaluator | 计算float类型的默认evaluator |
ArgbEvaluator | 计算颜色属性的默认evaluator |
TypeEvaluator | 允许创建自定义evaluator的一个接口,可以自定义实现TypeEvaluator接口来指定如何计算对象属性的动画值,对象属性可以是int、float、color或其他类型的。 |
- Interpolators
Interpolator是时间插值器,用来修饰动画效果,它可以指定属性值如何随时间变化的,反应了动画的运动速率,运动速率可以是线性变化的(如匀速)也可以是非线性变化的(如加速、减速)。
类/接口 | 描述 |
---|---|
AccelerateDecelerateInterpolator | 插入器的变化速度在开始和结束的地方慢,在中间的时候加速 |
AccelerateInterpolator | 变化速度开始缓慢,然后加速 |
AnticipateInterpolator | 开始后退,然后前进 |
AnticipateOvershootInterpolator | 开始后退,然后前进超过终点,最后返回终点 |
BounceInterpolator | 动画结束的时候弹跳至终点 |
CycleInterpolator | 动画循环播放指定的次数 |
DecelerateInterpolator | 变化速度加速开始,然后减慢 |
LinearInterpolator | 变化速度是固定的 |
OvershootInterpolator | 前进超过终点,最后返回终点 |
TimeInterpolator | TimeInterpolator是一个接口,如果以上插值器都不符合你的需求,可以实现TimeInterpolator接口来自定义插值器 |