Matrix的set,pre和post的区别

Android  代码片段  摘抄  2023年3月12日 am8:08发布2年前 (2023)更新 城堡大人
141 0 0

前言

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

主要是记录一下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博客

版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

Android Button 字母自动变大写记录

前言开发中,Button控件的Text 自动转为大写字母,这里记录一下,方便自己查询。好记性不如烂笔头正文字母自动变大写的原因只要我们用的Theme是Material或API Level 21+的默认 Theme,Button上的Text默认就是大写。解决方式第一种方法在Xml中的...

判断Service和Activity的存在

备忘在这,防止下次需要。1、判断服务是否在运行 /** * app service running */ public static boolean appServiceIsRunning(String classname) { if (null == classname...

Android Studio制作.9.png简单记录

前言项目中.9.png的用处很大,比如显示的title,需要一个背景图,由于文本长度不一,就需要使用这种.9.png图片。下面简单记(摘)录(抄)Android Studio制作.9.png的步骤。PS: 本文对网上大佬的文章进行简单记录而已,只是方便自己。好记性不如烂笔头正文Andro...

音视频学习:在Android 平台绘制一张图片

前言在Android平台绘制一张图片,使用至少3种不同的 API,ImageView,SurfaceView,自定义View正文下面分别使用ImageView、SurfaceView和自定义View,其中SurfaceView部分有参考其他网友(具体如下链接)。ImageView这个比较...

张承志:听人读书

有两件杯水末梢的小事,总想把它们记下备忘。其实备忘是不必的,因为已经顽固不弃地把它们忆了这么久,记之纸笔毕竟还是因为感动--哪怕周围写大潮大势的多么热闹,我还是更重视自己这种真实的小小感情。都是听孩子念书。地隔千里:一处是北国边界乌珠穆沁草地,一处是贫瘠之冠的宁夏山区小村。在内蒙插队到了那个年...

张定浩:我喜爱一切不彻底的事物

我喜爱一切不彻底的事物。细雨中的日光,春天的冷,秋千摇碎大风,堤岸上河水游荡。总是第二乐章 在半开的房间里盘桓;有些水果不会腐烂,它们干枯成轻盈的纪念品。 我喜爱一切不彻底的事物。琥珀里的时间,微暗的火,一生都在半途而废,一生都怀抱热望。 ...