从矩阵来看Android中的一些动画变换
个人博客: http://zhangsunyucong.top
开头
这篇博客,是参考了文章:Android Matrix,这篇文章有具体的分析过程和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的对称变换,再然后将坐标原点移回到原来的坐标原点即可。用矩阵表示大致是这样的:
图片