我们在自定义 View 控件时随处可见 Matrix 的身影,主要用于坐标转换映射,我们可以通过 Matrix 矩阵来控制视图的变换。
Matrix 本质上是一个如下图所示的矩阵:
上面每个值都有其对应的操作。
Matrix 提供了如下几个操作:
-
缩放(Scale)
对应 MSCALE_X 与 MSCALE_Y -
位移(Translate)
对应 MTRANS_X 与 MTRANS_Y -
错切(Skew)
对应 MSKEW_X 与 MSKEW_Y -
旋转(Rotate)
旋转没有专门的数值来计算,Matrix 会通过计算缩放与错切来处理旋转。
数学原理
我们先来简单的复习一下矩阵乘法规则。
我们在使用 Matrix 处理视图变换时本质上是通过矩阵映射坐标。
所以上述的几个操作都是对矩阵的操作,我们新建一个 Matrix 后其矩阵为默认状态,其值如下:
可以看到默认状态下的数据都是初始值,即不做任何变换处理,所有坐标保持原样。
缩放(Scale)
对于单个坐标来说,缩放只要将其坐标值值乘以缩放值即可。
假设对某个点宽度缩放 k1 倍,高度缩放 k2 倍,该点坐标为 x0、y0,缩放后坐标为 x、y,那么缩放的公式如下:
我们现在知道了缩放对应矩阵中的两个值的位置以及上面的公式,那现在在用矩阵来描述缩放操作:
等号左边的矩阵就是计算后的缩放结果。
Matrix 中用于缩放操作的方法有如下两个:
void setScale(float sx, float sy);
void setScale(float sx, float sy, float px, float py);
前面两个参数 sx、sy,分别是宽和高的缩放比例。
第二个重载方法多了两个参数 px、py,这两个参数用来描述缩放的枢轴点,关于枢轴点的含义可以看下注释:
Set the matrix to scale by sx and sy, with a pivot point at (px, py). The pivot point is the coordinate that should remain unchanged by the specified transformation.
大概说枢轴点是指定转换应保持不变的坐标。
当我们不传这两个参数时,枢轴点默认为左上角的点,缩放都是向下和向右,所以枢轴点可以大概的理解为缩放的锚点,缩放从这个点开始向四周扩散。
我们用矩阵来描述一下就能明白了。
初始化一个矩阵之后调用缩放方法:
Matrix matrix = new Matrix