Transformation 记录了仿射矩阵 Matrix,动画每触发一次,会对原来的矩阵做一次运算, View 的 Bitmap 与这个矩阵相乘就可实现相应的操作(旋转、平移、缩放等)。
Transformation 类封装了矩阵和 alpha 值,它有两个重要的成员,一是 mMatrix,二是 mAlpha。
Transformation 类图如下所示:
Transformation 类图
如何在 View 中实现动画从逻辑上讲,实现动画需要如下几步:
view 创建动画对象,设置动画属性,调用 invalidate 刷新屏幕,启动动画; invalidate 方法触发了 onDraw 函数; 在 onDraw 函数中: 调用动画的 getTransformation 方法,得到当前时间点的矩阵 将该矩阵设置成 Canvas 的当前矩阵 调用 canvas 的 drawBitmap 方法,绘制屏幕。 判断 getTransformation 的返回值,若为真,调用 invalidate 方法,刷新屏幕进入下一桢;若为假,说明动画完成。整个流程可用一个序列图表示:
Tween 动画序列图
使用样例下面的代码是一个 view,系统创建 view 时会调用 onCreate 方法,该方法定义了一个 TranslateAniamtion,指定了移动起点和终点,动画持续时间为 1s,最后调用 startAnimation 将该动画保存在 View 的成员 mCurrentAnianmtion 中并启动动画。
注意,在 View 中需要定义成员变量 mCurrentAnimation 和 mTransformation ,分别记录当前的动画和变换。另外需要定义成员函数 startAnimation 启动动画。
class MyView extends View { Animation mCurrentAnimation = null; Transformation mTransformation = new Transformation;