导航号,我的单页导航
文章目录

前言

本文内容基本摘抄,只不过自己重新整理了一下,方便自己查阅而已。

主要是记录一下MatrixsetScalepreScalepostScale 的区别。

正文

setScale,preScale和postScale都是用于改变缩放值的。

  1. setScale(sx,sy),首先会将该Matrix设置为对角矩阵,即相当于调用reset()方法,然后在设置该Matrix的MSCALE_X和MSCALE_Y直接设置为sx,sy的值
  2. preScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M’ = M * S(sx, sy)。
  3. 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

跟前面一、二和三的讲解,我们知道:

  1. 两个pre方法,执行顺序跟代码顺序相反
  2. 一个post方法一个pre方法,不论代码顺序如何,一定先执行pre方法,后执行post方法
  3. 两个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

也就是说

  1. set方法优先于pre和post方法
  2. set方法之前pre和post方法被reset了,所以无效

参考文章

  1. setScale,preScale 和 postScale 的区别_浪浪的程序猿的博客-CSDN博客

© 版权声明
导航号,我的单页导航

暂无评论

暂无评论...