了解Matrix

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

数学中矩阵的数乘

矩阵的乘法

数乘
  • 矩阵A的列数j等于矩阵B的行数i,两个矩阵才能数乘

  • 矩阵A的第j列的数字,乘以矩阵B的第i行的数字,得到相乘后矩阵第i行第j列的值。

  • 矩阵A乘以矩阵B,得到的矩阵的容积等于矩阵A的行数i乘以矩阵B的列数j

矩阵的乘法规则:

image.png

我们在使用 Matrix 处理视图变换时本质上是通过矩阵映射坐标。
所以上述的几个操作都是对矩阵的操作,我们在Android中新建一个 Matrix 后其矩阵为默认状态,其值如下:


image.png

可以看到默认状态下的数据都是初始值,即不做任何变换处理,所有坐标保持原样

在Android中矩阵各元素的含义,persp代表透视(官方文档中,也没有详细讲解,透视在这里只做简单介绍),如下图:


image.png

翻译成中文:


image.png

image.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,调用该方法后矩阵变换为:
image.png

注意:为什么平移的位置会出现150的值,是因为我们设置了枢轴点后 Matrix 会做一次位移操作,平移距离就是 s * p.

其他的示例请看这篇博文:https://www.jianshu.com/p/5e30db034596

旋转

image.png

你可能感兴趣的:(了解Matrix)