从矩阵来看Android中的一些动画变换


开头

这篇博客具体的分析过程和android实例。我只是参考和根据自己的理解写的。

在Android中,我们可以从数学的角度来看颜色和动画的变换。这里会从矩阵变换的角度来理解平移,旋转,缩放,对称的变换。

这些变换的完成实际上,是操作一个3X3的矩阵的。而这四种基本变换与操作和这个矩阵有什么样的关系呢?下面会分析。

图片

在Android中,已经为每种变换提供了pre、set和post三种操作方式。

set 用于设置Matrix中的值。
pre 是先乘,因为矩阵的乘法不满足交换律,因此先乘、后乘必须要严格区分。先乘相当于矩阵运算中的右乘。
post 是后乘,因为矩阵的乘法不满足交换律,因此先乘、后乘必须要严格区分。后乘相当于矩阵运算中的左乘。

另外,除平移变换(Translate)外,旋转变换(Rotate)、缩放变换(Scale)和错切变换(Skew)都可以围绕一个中心点来进行,如果不指定,在默认情况下是围绕(0, 0)来进行相应的变换的。

平移变换

图片

假设坐标系中有A和B两个点,从A平移到B点,它们之间的关系上图所示。

在x和y轴的移动增量分别是:
图片
则易得:
图片
它的矩阵表示为:
图片

旋转变换

1、围绕坐标原点旋转

图片

由A点顺时针旋转一定角度到B点,如图所示。

由图易知:
图片
由上面四个式子,可得:
图片
矩阵表示,得:
图片

旋转变换

2、围绕某点旋转

假设旋转点是:
图片
顺时针旋转,结合1、上面的推导结果,可以得到矩阵:
图片
可以化为:
图片

可知,围绕某一点进行旋转变换,可以分成3个步骤,即首先将坐标原点移至该点,然后围绕新的坐标原点进行旋转变换,再然后将坐标原点移回到原先的坐标原点。

缩放变换

A点的x,y坐标分别放大a,b倍。则有一下关系:
图片
用三维矩阵表示为:
图片

对称变换

1、如果对称轴是x轴,则有:
图片
用三维矩阵表示为:
图片

2、如果对称轴是y轴,则有:
图片
用三维矩阵表示为:
图片

3、如果对称轴是y = x轴,如图
图片
由等腰直角三角形可知:
图片
已知中点在对称轴上,由中点坐标公式,易得:
图片
联合两式子,2式先乘以2,再两式相加和相减,可得:
图片
用三维矩阵表示为:
图片
4、如果对称轴是y = -x轴。
同理,易推导得:
图片

5、如果对称轴是y = kx时。如图

图片

由图易知:
图片
则有:
图片
由直线的斜率公式,可得:
图片
中点坐标在直线上,结合中点坐标公式,易得:
图片
由上面两式,可求得:
图片
用三维矩阵表示为:
图片

k为任意实数,可以取特殊的值,验证前面对称推导的结果。k为1或者-1时,k为0时,k为无穷大时等等。

6、如果对称轴是y = kx + b时

只需要在5的基础上增加两次平移变换即可,即先将坐标原点移动到(0, b),然后做上面的关于y = kx的对称变换,再然后将坐标原点移回到原来的坐标原点即可。用矩阵表示大致是这样的:
图片