这篇文章来讲讲 Android 中的动画,Animation 和 Animator。
目录:
- Animation
- Animator
1. Animation
- 1.1 简介
Animation 分为两种:
- Tween Animation (渐变动画):通过对场景里的对象不断做图像变换 (平移、缩放、旋转) 产生动画效果。
- Frame Animation (帧动画) :顺序播放事先做好的图像,类似放电影。
而 Tween Animation 又分为四种:
- Alpha:渐变透明度动画效果。
- Scale:渐变尺寸伸缩动画效果。
- Translate:画面转换位置移动动画效果。
- Rotate:画面转换位置移动动画效果。
可以使用 xml 或者 代码来实现,Animation 的具体使用可以看这篇文章:android - Animation详解。那么既然有了 Animation,Android 为什么还要提供属性动画 (Animator)?
- 1.2 缺点
(1) 作用对象局限:View
只能够作用在视图 View
上,即只可以对一个 Button
、TextView
、甚至是 LinearLayout
、或者其它继承自 View
的组件进行动画操作,但无法对非 View
的对象进行动画操作。
有些情况下的动画效果只是视图的某个属性 & 对象而不是整个视图。比如如需要实现视图的颜色动态变化,那么就需要操作视图的颜色属性从而实现动画效果,而不是针对整个视图进行动画操作。
(2) 没有改变 View 的属性,只是改变视觉效果
补间动画只是改变了 View
的视觉效果,而不会真正去改变 View
的属性。如将屏幕左上角的按钮通过补间动画移动到屏幕的右下角,点击当前按钮位置(屏幕右下角)是没有效果的,因为实际上按钮还是停留在屏幕左上角,补间动画只是将这个按钮绘制到屏幕右下角,改变了视觉效果而已,即内部坐标没有发生变化。如果想真正改变 View 的位置,可以监听动画状态,在结束时设置 View 的 LayoutParams。
Animator 为何不能真正改变 View 的位置,而属性动画却可以?
- Animation 改变的只是 View 的显示,而没有改变 View 的响应区域;而属性动画会通过反射技术来获取和执行属性的get、set 方法,从而改变了对象位置的属性值。
- Animation 产生的动画数据实际并不是应用在 View 本身的,而是应用在 RenderNode 或者 Canvas 上的,这就是为什么 Animation 不会改变 View 的属性的根本所在。
(3) 动画效果单一
补间动画只能实现平移、旋转、缩放 & 透明度这些简单的动画需求。一旦遇到相对复杂的动画效果,即超出了上述 4 种动画效果,那么补间动画则无法实现。
2. Animator
为了解决补间动画的缺陷,在 Android 3.0
开始,系统提供了一种全新的动画模式:属性动画 (Property Animation)。它的特点是什么呢?
- 作用对象进行了扩展:不只是 View 对象,可以是任何对象。
- 动画效果:不只是 4 种基本变换,还有其他动画效果。
- 作用领域:Android 3.0 后引入的。
它的原理是:在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果 (可以是任意对象的任意属性)。
Animator 的具体使用可以看这篇文章:【Android】属性动画(基本用法)。