利用Matrix实现了图片的平移(Translate)是将坐标系进行了平移么?不是的。Matrix所操作的是原图的每个像素点,它和坐标系是没有关系的。比如Scale是对每个像素点都进行了缩放,例如:
matrix.postScale(0.5f, 0.5f);
将原图的每个像素点的X的坐标都缩放成了原本的0.5
将原图的每个像素点的Y坐标也都缩放成了原本的0.5
同样的道理在调用matrix.setTranslate( )时是对于原图中的每个像素都执行了位移操作。
在使用Matrix时经常用到一系列的set,pre,post方法。它们有什么区别呢?它们的调用顺序又会对实际效果有什么影响呢?
在此对该问题做一个总结:
在调用set,pre,post时可视为将这些方法插入到一个队列。
pre表示在队头插入一个方法
post表示在队尾插入一个方法
set表示清空队列
队列中只保留该set方法,其余的方法都会清除。
当执行了一次set后pre总是插入到set之前的队列的最前面;post总是插入到set之后的队列的最后面。
也可以这么简单的理解:
set在队列的中间位置,per执行队头插入,post执行队尾插入。
当绘制图像时系统会按照队列中从头至尾的顺序依次调用这些方法。
请看下面的几个小示例:
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)
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)