目录
前言
本文内容基本摘抄,只不过自己重新整理了一下,方便自己查阅而已。
主要是记录一下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了,所以无效
参考文章
暂无评论...
随机推荐
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这个比较...
张承志:听人读书
有两件杯水末梢的小事,总想把它们记下备忘。其实备忘是不必的,因为已经顽固不弃地把它们忆了这么久,记之纸笔毕竟还是因为感动--哪怕周围写大潮大势的多么热闹,我还是更重视自己这种真实的小小感情。都是听孩子念书。地隔千里:一处是北国边界乌珠穆沁草地,一处是贫瘠之冠的宁夏山区小村。在内蒙插队到了那个年...
张定浩:我喜爱一切不彻底的事物
我喜爱一切不彻底的事物。细雨中的日光,春天的冷,秋千摇碎大风,堤岸上河水游荡。总是第二乐章 在半开的房间里盘桓;有些水果不会腐烂,它们干枯成轻盈的纪念品。 我喜爱一切不彻底的事物。琥珀里的时间,微暗的火,一生都在半途而废,一生都怀抱热望。 ...