目录
前言
本文内容基本摘抄,只不过自己重新整理了一下,方便自己查阅而已。
主要是记录一下Matrix中setScale,preScale和postScale 的区别。
正文
setScale,preScale和postScale都是用于改变缩放值的。
- setScale(sx,sy),首先会将该Matrix设置为对角矩阵,即相当于调用reset()方法,然后在设置该Matrix的MSCALE_X和MSCALE_Y直接设置为sx,sy的值
- preScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M’ = M * S(sx, sy)。
- postScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M’ = S(sx, sy) * M。
PS : 重点,三个方法中就setScale()会重置Matrix
下面结合例子进行讲解。
一、pre方法的执行顺序
Matrix matrix = new Matrix();
float[] points = new float[]{10.0f, 10.0f};
matrix.preScale(2.0f, 3.0f);
matrix.preTranslate(8.0f, 7.0f);
matrix.mapPoints(points);
打印结果
start : 10.0 10.0
//执行mapPoints后
edn : 36.0 51.0
我们知道,如果按照顺序执行,应该是
10.0 10.0
//放大(2.0f, 3.0f)倍
20.0 30.0
//移动(8.0f,7.0f)
28.0 37.0
当最后结果却是
36.0 51.0
也就是先执行了preTranslate(), 再执行preScale()
10.0 10.0
//移动(8.0f,7.0f)
18.0 17.0
//放大(2.0f, 3.0f)倍
36.0 51.0
这说明pre方法【方向跟实际顺序相反】
二、post方法的执行顺序
Matrix matrix = new Matrix();
float[] points = new float[]{10.0f, 10.0f};
matrix.postScale(2.0f, 3.0f);
matrix.postTranslate(8.0f, 7.0f);
matrix.mapPoints(points);
打印结果
start : 10.0 10.0
//执行mapPoints后
ene : 28.0 37.0
这说明post方法【方向跟实际顺序一致】
三、pre方法和post方法组合
分两种情况,一种是先post后pre,另外一种是先pre后post
第一种代码顺序先post后pre
Matrix matrix = new Matrix();
float[] points = new float[]{10.0f, 10.0f};
matrix.postScale(2.0f, 3.0f);
matrix.preTranslate(8, 7);
matrix.mapPoints(points);
打印结果
start : 10.0 10.0
end : 36.0 51.0
第二种代码顺序先pre后post
Matrix matrix = new Matrix();
float[] points = new float[]{10.0f, 10.0f};
matrix.preTranslate(8, 7);
matrix.postScale(2.0f, 3.0f);
matrix.mapPoints(points);
打印结果
start : 10.0 10.0
end : 36.0 51.0
小结
pre方法优先于post方法执行,但是,如果存在两个pre方法,最后面的先执行。
四、set方法会重置Matrix
这个得小心使用,使用set方法会重置Matrix,也就是之前写的配置都无效。
未使用set方法
Matrix matrix = new Matrix();
float[] points = new float[]{10.0f, 10.0f};
matrix.postScale(2.0f, 3.0f); // 代码 1
matrix.preRotate(90); // 代码 2
matrix.postTranslate(8.0f, 7.0f); // 代码 3
matrix.preScale(2.0f, 2.0f); // 代码 4
matrix.mapPoints(points);
打印结果
start : 10.0 10.0
end : -32.0 67.0
跟前面一、二和三的讲解,我们知道:
- 两个pre方法,执行顺序跟代码顺序相反
- 一个post方法一个pre方法,不论代码顺序如何,一定先执行pre方法,后执行post方法
- 两个post方法,按照代码顺序执行
因此上面代码执行顺序是
代码 4 : 20.0f 20.0f
代码 2 : -20.0f 20.0f
代码 1 : -40.0f 60.0f
代码 3 : -32.0f 67.0f
使用set方法
Matrix matrix = new Matrix();
float[] points = new float[]{10.0f, 10.0f};
matrix.postScale(2.0f, 3.0f); // 代码 1
matrix.preRotate(90); // 代码 2
matrix.setScale(2.0f, 2.0f); // 代码 3
matrix.postTranslate(8.0f, 7.0f); // 代码 4
matrix.preScale(2.0f, 2.0f); // 代码 5
matrix.mapPoints(points);
代码3是使用了setScale()方法。
打印结果
start : 10.0 10.0
end : 48.0 47.0
由于代码中有set方法,真正执行的只用
代码 1
代码 2
//优先set方法,并Matrix进行了reset
代码 3
代码 5
代码 4
也就是说
- set方法优先于pre和post方法
- set方法之前pre和post方法被reset了,所以无效
参考文章
© 版权声明