Matrix的set,pre和post的区别

Android  代码片段  摘抄  2023年3月12日 am8:08发布2年前 (2023)更新 91es.com站长
111 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、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

梁文道 :清贫与富贵

我在台湾念小学的时候,有一个同学是军人子弟,他的父亲大概很早就退伍了,所以没有领到太多的长俸和福利,后来务农为生,日子过得很辛苦。虽然贫困,但他家的桌子总是擦得一尘不染,厕所地板亮得反光。每次到他家吃饭,我都震慑于老伯伯一口洪亮的山东腔,以及他那威严的仪容。而他的孩子,我这位同学,尽管一身旧衣早...

隐藏Settings中的Preference笔记

在Android项目开发中,客户要求精简Settings,也就是删除部分不需要或者无用的功能,因此需要影藏Preference等,下面是摘抄网友并自己加工整理的。隐藏 Preference 有两种方法:一、先在xml布局里面删,然后在java里面删掉调用的相关部分,但如果很多地方都有调...

Android ListView子item高度定长固定值无效问题详解

前言最近做显示音乐列表信息时,发现ListView的Item布局中固定的高度失效了,怎么设置这个高度都失效。参考网用和自己折腾过程,记录一下,防止下次忘记。总结整理一下原因:1. LayoutInflater.inflate(int resource, ViewGroup root)...

陈先发:前世

要逃,就干脆逃到蝴蝶的体内去不必再咬着牙,打翻父母的阴谋和药汁不必等到血都吐尽了。要为敌,就干脆与整个人类为敌。他哗地一下脱掉了蘸墨的青袍脱掉了一层皮脱掉了内心朝飞暮倦的长亭短亭。脱掉了云和水这情节确实令人震悚:他如此轻易地又脱掉了自己的骨头!我无限眷恋的最后一幕是:他们纵身一跃...

[摘]Android IO流读写文件

一、概念文件在程序中是以流的形式来操作的。流:是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两个存储位置之间的传输称为流。流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。二、分类1、按照流向划分:输入流、输出流以内存为参照:输...

修改ListVieW等滚动条图片

前言本文简单的介绍Java代码中修改RecyclerView、ListView和GridView普通滚动条图片。正文隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读参考文件