Android矩阵的讲解博文:
https://blog.csdn.net/darkrabbit/article/details/80025935
https://blog.csdn.net/feather_wch/article/details/79622095
矩阵的百度百科:https://baike.baidu.com/item/%E7%9F%A9%E9%98%B5/18069?fr=aladdin#2
数学中矩阵的数乘
![](https://img.haomeiwen.com/i6059826/f24dbfda6b7e1635.png)
![](https://img.haomeiwen.com/i6059826/3faf4113dfe5ee6a.png)
-
矩阵A的列数j等于矩阵B的行数i,两个矩阵才能数乘
-
矩阵A的第j列的数字,乘以矩阵B的第i行的数字,得到相乘后矩阵第i行第j列的值。
-
矩阵A乘以矩阵B,得到的矩阵的容积等于矩阵A的行数i乘以矩阵B的列数j
矩阵的乘法规则:
![](https://img.haomeiwen.com/i6059826/1350f844f5e1ac3e.png)
我们在使用 Matrix 处理视图变换时本质上是通过矩阵映射坐标。
所以上述的几个操作都是对矩阵的操作,我们在Android中新建一个 Matrix 后其矩阵为默认状态,其值如下:
![](https://img.haomeiwen.com/i6059826/cefa3031f7c8d9d7.png)
可以看到默认状态下的数据都是初始值,即不做任何变换处理,所有坐标保持原样
在Android中矩阵各元素的含义,persp代表透视(官方文档中,也没有详细讲解,透视在这里只做简单介绍),如下图:
![](https://img.haomeiwen.com/i6059826/a5257e633129f1fe.png)
翻译成中文:
![](https://img.haomeiwen.com/i6059826/1b96413a94e8e0aa.png)
![](https://img.haomeiwen.com/i6059826/82ac94dc3cc3fc7d.png)
上面每个值都有其对应的操作。
Matrix 提供了如下几个操作:
-
缩放(Scale)
对应 MSCALE_X 与 MSCALE_Y -
位移(Translate)
对应 MTRANS_X 与 MTRANS_Y -
错切(Skew)
对应 MSKEW_X 与 MSKEW_Y -
旋转(Rotate)
旋转没有专门的数值来计算,Matrix 会通过计算缩放与错切来处理旋转。
这里重点讲下缩放示例:
Matrix 中用于缩放操作的方法有如下两个:
void setScale(float sx, float sy);
void setScale(float sx, float sy, float px, float py);
前面两个参数 sx、sy,分别是宽和高的缩放比例。
第二个重载方法多了两个参数 px、py,这两个参数用来描述缩放的枢轴点
大概说枢轴点是指定转换应保持不变的坐标。
当我们不传这两个参数时,枢轴点默认为左上角的点,缩放都是向下和向右,所以枢轴点可以大概的理解为缩放的锚点,缩放从这个点开始向四周扩散。
我们用矩阵来描述一下就能明白了。
初始化一个矩阵之后调用缩放方法:
Matrix matrix = new Matrix()
matrix.setScale(0.5F, 0.5F, 300F, 300F);
缩放 0.5 倍,枢轴点为 300,调用该方法后矩阵变换为:
![](https://img.haomeiwen.com/i6059826/9d5ad472b5c2044a.png)
注意:为什么平移的位置会出现150的值,是因为我们设置了枢轴点后 Matrix 会做一次位移操作,平移距离就是 s * p.
其他的示例请看这篇博文:https://www.jianshu.com/p/5e30db034596
旋转
![](https://img.haomeiwen.com/i6059826/f39ab9ad68704ddb.png)
网友评论