1 Matrix是什么
Matrix
在内存中,就是一个长度为9的一维数组,可以用矩阵进行表示,如下图:
通过这9个变量名可以发现,对Matrix
的操作可以实现对组件的缩放,错切以及平移。最后一行的3个变量是在3D变换中使用,不在本篇的讨论范围。
执行preScale(x,y)
改变的就是MSCALE_X
和MSCALE_Y
的值,以此类推。
2 怎么操作Matrix
2.1 先了解几条规则:
1.操作矩阵是有左乘和右乘的分别,但是没有先执行谁,后执行谁的概念;
pre : 右乘, M‘ = M * A
post : 左乘, M’ = A * M
2.矩阵的操作满足结合律
M = (A * B) * C = A * (B * C )
2.2 上例子:实现围绕点P(x,y)进行旋转S操作
因为默认坐标系是(0,0),所以该操作可以划分为三个步骤:
1.移动坐标系到(x,y)位置;
2.旋转S;
3.把坐标系移回原点。
利用Matrix
写出来如下:
//最开始new出来,始终为单位矩阵
Matrix matrix = new Matrix();
matrix.preTranslate(x,y);
matrix.preRotate(S);
matrix.preTranslate(-x, -y);
需要注意的点是:scale操作会对整个画布造成缩放效果,而后的操作会在这个缩放效果上进行。比如:如果scale(2,0) ,那么接下来transform(100,0),其实是在x轴方向上移动了200像素。
Matrix matrix = new Matrix();
matrix.preScale(2, 0);
matrix.preTranslate(100, 0);
LogUtils.d("matrix: " + matrix.toShortString());
打印结果:matrix: [2.0, 0.0, 200.0][0.0, 0.0, 0.0][0.0, 0.0, 1.0]
网友评论