Matrix主要用于对平面进行平移(Translate),缩放(Scale),旋转(Rotate)以及斜切(Skew)操作。
为简化矩阵变换,Android封装了一系列方法来进行矩阵变换;其中包括:
1.set系列方法:setTranslate,setScale,setRotate,setSkew;设置,会覆盖之前的参数。
2.pre系列方法:preTranslate,preScale,preRotate,preSkew;矩阵先乘,如M’ = M * T(dx, dy)。
3.post系列方法:postTranslate,postScale,postRotate,postSkew;矩阵后乘,如M’ = T(dx, dy) * M。
顺序
Matrix里面就好比维护者一个双端队列
当调用preXxx方法时,将该方法放入队列的顶端,(即每来一个preXxx方法就按照代码的书写顺序依次放入队列的顶端)
当调用setXxx方法时,清空当前队列,(如此说来,在setXxx之前调用的preXxx,postXxx都是无效的)
当调用postXxx方法时,将方法放入队列的末端,(即每来一个postXxx方法就按照代码的书写顺序依次放入队列的顶端)
例子分析
例一:
Matrix m = new Matrix();
m.setRotate(30); - 被覆盖不执行
m.setTranslate(10, 10); -(1)
只有m.setTranslate(10, 10)有效,因为m.setRotate(30);被清除.
例子二:
Matrix m = new Matrix();
m.setTranslate(10, 10); -(1)
m.postRotate(30); -(2)
先执行m.setTranslate(10, 10);后执行m.postRotate(30);
例子三:
Matrix m = new Matrix();
m.setTranslate(10, 0); -(2)
m.preRotate(30); -(1)
先执行m.preRotate(30);后执行;m.setTranslate(10, 10)
例子四:
Matrix m = new Matrix();
m.preScale(2f,2f); -(2)
m.preTranslate(50f, 20f); -(1)
m.postScale(0.2f, 0.5f); -(3)
m.postTranslate(20f, 20f); -(4)
执行顺序 :m.preTranslate(50f, 20f)–>m.preScale(2f,2f)–>m.postScale(0.2f, 0.5f)–>m.postTranslate(20f, 20f)
注意:m.preTranslate(50f, 20f)比m.preScale(2f,2f)先执行,因为它查到了队列的最前端.
例子五:
Matrix m = new Matrix();
m.postTranslate(20, 20);
m.preScale(0.2f, 0.5f);
m.setScale(0.8f, 0.8f); -(2)清空了上面的所有操作
m.postScale(3f, 3f); -(3)
m.preTranslate(0.5f, 0.5f); -(1)
执行顺序:m.preTranslate(0.5f, 0.5f)–>m.setScale(0.8f, 0.8f)–>m.postScale(3f, 3f)
注意:m.setScale(0.8f, 0.8f)清除了前面的m.postTranslate(20, 20)和m.preScale(0.2f, 0.5f);