1 Matrix是什么
Matrix
在內(nèi)存中待错,就是一個長度為9的一維數(shù)組,可以用矩陣進行表示烈评,如下圖:
通過這9個變量名可以發(fā)現(xiàn)火俄,對Matrix
的操作可以實現(xiàn)對組件的縮放,錯切以及平移讲冠。最后一行的3個變量是在3D變換中使用瓜客,不在本篇的討論范圍。
執(zhí)行preScale(x,y)
改變的就是MSCALE_X
和MSCALE_Y
的值竿开,以此類推谱仪。
2 怎么操作Matrix
2.1 先了解幾條規(guī)則:
1.操作矩陣是有左乘和右乘的分別,但是沒有先執(zhí)行誰否彩,后執(zhí)行誰的概念疯攒;
pre : 右乘, M‘ = M * A
post : 左乘列荔, M’ = A * M
2.矩陣的操作滿足結(jié)合律
M = (A * B) * C = A * (B * C )
2.2 上例子:實現(xiàn)圍繞點P(x,y)進行旋轉(zhuǎn)S操作
因為默認坐標系是(0,0)敬尺,所以該操作可以劃分為三個步驟:
1.移動坐標系到(x,y)位置;
2.旋轉(zhuǎn)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());
打印結(jié)果:matrix: [2.0, 0.0, 200.0][0.0, 0.0, 0.0][0.0, 0.0, 1.0]