WMS 的动画系统

384 阅读2分钟

0. 前言

WMS 不负责窗口的具体绘制,因此WMS动画系统仅仅会影响窗口的位置、显示尺寸与透明度,不会影响窗口上所绘制的内容。

窗口的动画在窗口的客户端由 ViewRootImp 驱动完成。

动画系统中所改变的显示尺寸与布局过程中的Surface 尺寸是两个不同的概念。

布局过程中的 Surface 尺寸是 Surface 的实际尺寸,这个尺寸决定了其 GraphicBuffer 的大小以及 Canvas 可以绘制的区域。

动画过程中的尺寸则是渲染尺寸,只是在最终的输出过程中将 Surface 的内容放大或缩小。

1.Android 动画原理

1.1 Animation 类和 Transform 类

Android提供了平移(Translate)、缩放(Scale)、旋转(Rotate)以及透明度(Alpha)4种类型的动画。这些动画分别由TranslateAnimation类、ScaleAnimation类、RotateAnimation类以及AlphaAnimation类实现,它们都是Animation类的子类。

直观上,很多人可能都会认为Animation及其子类在开始动画后会在某一个线程中以一定的频率不断地操作动画目标的相关属性,从而实现动画效果。其实不然,Android中的Animation类的功能非常轻量级。在给定了初始状态、结束状态、启动时间与持续时间后,该类可以为使用者计算其动画目标在任意时刻的变换(Transformation),这是Animation类唯一的用途。

Transformation类描述了一个变换。它包含了两个分量:透明度及一个二维变换矩阵。同变换矩阵的运算一样,多个Transformation也可以进行类似于矩阵的先乘、后乘等叠加操作。其计算方法为,透明度分量相乘,变换矩阵分量进行相应的先乘、后乘。

二维变换矩阵可以在二维空间中对变换目标实现平移、旋转、缩放与切变等效果。将两个矩阵相乘可以组合其各自的变换效果