Matrix的set,pre,post调用顺序

来源:互联网 发布:珠海网站seo 编辑:程序博客网 时间:2024/07/17 04:43

参考:Matrix的set,pre,post调用顺序

Matrix主要用于对平面进行平移(Translate),缩放(Scale),旋转(Rotate)以及斜切(Skew)操作。
为简化矩阵变换,Android封装了一系列方法来进行矩阵变换;其中包括:
set系列方法:setTranslate,setScale,setRotate,setSkew;设置,会覆盖之前的参数。
pre系列方法:preTranslate,preScale,preRotate,preSkew;矩阵先乘,如M’ = M * T(dx, dy)。
post系列方法:postTranslate,postScale,postRotate,postSkew;矩阵后乘,如M’ = T(dx, dy) * M。

Matrix调用一系列set,pre,post方法时,可视为将这些方法插入到一个队列.当然,按照队列中从头至尾的顺序调用执行.
其中

pre表示在队头插入一个方法,
post表示在队尾插入一个方法.
set表示把当前队列清空,并且总是位于队列的最中间位置.

当执行了一次set后:pre方法总是插入到set前部的队列的最前面,post方法总是插入到set后部的队列的最后面。

例一:

Matrix m = new Matrix();m.setRotate(45); m.setTranslate(80, 80);

只有m.setTranslate(80, 80)有效,因为m.setRotate(45);被清除.

例子二:

Matrix m = new Matrix();m.setTranslate(80, 80);m.postRotate(45);

先执行m.setTranslate(80, 80);
后执行m.postRotate(45);

例子三:

Matrix m = new Matrix();m.setTranslate(80, 80);m.preRotate(45);

先执行m.preRotate(45);
后执行m.setTranslate(80, 80);

例子四:

Matrix m = new Matrix();m.preScale(2f,2f);    m.preTranslate(50f, 20f);   m.postScale(0.2f, 0.5f);    m.postTranslate(20f, 20f);  

执行顺序:
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);   m.postScale(3f, 3f);m.preTranslate(0.5f, 0.5f);

执行顺序:
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);

应用:

matrix.setScale(interpolatedTime, interpolatedTime);matrix.preTranslate(-centerX, -centerY);matrix.postTranslate(centerX, centerY);

经常在中心缩放的应用中看到这段代码.

preTranslate是指在setScale前,平移,
postTranslate是指在setScale后平移
注意他们参数是平移的距离,而不是平移目的地的坐标!

由于缩放是以(0,0)为中心的,所以为了把界面的中心与(0,0)对齐,就要preTranslate(-centerX, -centerY),
setScale完成后,调用postTranslate(centerX, centerY),再把图片移回来,这样看到的动画效果就是activity的界面图片从中心不停的缩放了

注:centerX和centerY是界面中心的坐标。

原创粉丝点击