Android中Matrix的pre post set方法理解
2014-12-12 16:58
309 查看
虽说以前学习过线性代数和图形学原理,但是在实际中碰到matrix还是疑惑了好一阵子,今天通过向同事请教终于找到一点门路,特总结如下:
Matrix主要用于对平面进行缩放,平移,旋转以及倾斜操作,为简化矩阵变换,Android封装了一系列方法来进行矩阵变换,其中包括pre系列方法:preScale,preTranslate,preRotate,preSkew,set系列方法:setScale,setTranslate,setRotate,setSkew,post系列方法:postScale,postTranslate,postRotate,postSkew。
通过将变换矩阵与原始矩阵相乘来达到变换的目的,例如:
平移:
![](http://www.linuxidc.com/upload/2012_07/120711141536541.png)
旋转:
![](http://www.linuxidc.com/upload/2012_07/120711141536542.png)
缩放:
![](http://www.linuxidc.com/upload/2012_07/120711141536543.png)
有一点要说明:上图中的原始矩阵为3*1的矩阵,我们可以将其扩展成3*3的矩阵,否则下文涉及到的后乘操作将不成立,甚至在后乘的时候我们可以看成是1*3的矩阵,这不影响实际的变换效果。
之前一直不理解为什么要设置pre,set和post三种变换操作,我一直认为只通过post操作即可完成所有的变换,后来通过查阅相关资料以及同事的指点,有了一些粗浅的认识,当然现在的认识仍然是模模糊糊,甚至是错误的,希望通过博客和大家分享并纠正我可能存在的错误。
pre方法表示矩阵前乘,例如:变换矩阵为A,原始矩阵为B,pre方法的含义即是A*B
post方法表示矩阵后乘,例如:变换矩阵为A,原始矩阵为B,post方法的含义即是B*A
matrix.preScale(0.5f, 1);
matrix.preTranslate(10, 0);
matrix.postScale(0.7f, 1);
matrix.postTranslate(15, 0);
等价于:
translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0)
注意:后调用的pre操作先执行,而后调用的post操作则后执行。
set方法一旦调用即会清空之前matrix中的所有变换,例如:
matrix.preScale(0.5f, 1);
matrix.setScale(1, 0.6f);
matrix.postScale(0.7f, 1);
matrix.preTranslate(15, 0);
等价于
translate(15, 0) -> scale(1, 0.6f) -> scale(0.7f, 1)
matrix.preScale (0.5f, 1)将不起作用。
以下为个人理解,不保证一定正确:
如果通过getMatrix()得到的matrix是一个未经过任何变换的单元矩阵,或者是之前已经调用过setMatrix的matrix,那么我们可以仅使用post系列方法或者pre系列方法的其中一种来完成各种变换操作,因为此时我们仅使用pre或者post方法来定义各种变换次序。
但是如果我们得到的matrix是一个非单元矩阵,并且该matrix还未调用setMatrix应用到实际中,此时我们可能同时需要pre和post方法来实现我们所需要的变换,例如C是通过getMatrix得到的并满足之前描述的matrix,此时如果我想在现有的变换之前进行某些变换,此时只有pre方法可以做到,假如C是一个执行过postScale操作的matrix,此时我想在postScale之前进行平移,那只有调用preTranslate,这样当调用setMatrix的时候会先进行preTranslate操作,再进行postScale操作。必须这么做的前提就是先scale后translate和先translate后scale得到的是不同的变换效果。
个人觉得以上分析结果很可能存在一些偏差,如哪位大侠发现错误还请麻烦指正~~
Matrix主要用于对平面进行缩放,平移,旋转以及倾斜操作,为简化矩阵变换,Android封装了一系列方法来进行矩阵变换,其中包括pre系列方法:preScale,preTranslate,preRotate,preSkew,set系列方法:setScale,setTranslate,setRotate,setSkew,post系列方法:postScale,postTranslate,postRotate,postSkew。
通过将变换矩阵与原始矩阵相乘来达到变换的目的,例如:
平移:
![](http://www.linuxidc.com/upload/2012_07/120711141536541.png)
旋转:
![](http://www.linuxidc.com/upload/2012_07/120711141536542.png)
缩放:
![](http://www.linuxidc.com/upload/2012_07/120711141536543.png)
有一点要说明:上图中的原始矩阵为3*1的矩阵,我们可以将其扩展成3*3的矩阵,否则下文涉及到的后乘操作将不成立,甚至在后乘的时候我们可以看成是1*3的矩阵,这不影响实际的变换效果。
之前一直不理解为什么要设置pre,set和post三种变换操作,我一直认为只通过post操作即可完成所有的变换,后来通过查阅相关资料以及同事的指点,有了一些粗浅的认识,当然现在的认识仍然是模模糊糊,甚至是错误的,希望通过博客和大家分享并纠正我可能存在的错误。
pre方法表示矩阵前乘,例如:变换矩阵为A,原始矩阵为B,pre方法的含义即是A*B
post方法表示矩阵后乘,例如:变换矩阵为A,原始矩阵为B,post方法的含义即是B*A
matrix.preScale(0.5f, 1);
matrix.preTranslate(10, 0);
matrix.postScale(0.7f, 1);
matrix.postTranslate(15, 0);
等价于:
translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0)
注意:后调用的pre操作先执行,而后调用的post操作则后执行。
set方法一旦调用即会清空之前matrix中的所有变换,例如:
matrix.preScale(0.5f, 1);
matrix.setScale(1, 0.6f);
matrix.postScale(0.7f, 1);
matrix.preTranslate(15, 0);
等价于
translate(15, 0) -> scale(1, 0.6f) -> scale(0.7f, 1)
matrix.preScale (0.5f, 1)将不起作用。
以下为个人理解,不保证一定正确:
如果通过getMatrix()得到的matrix是一个未经过任何变换的单元矩阵,或者是之前已经调用过setMatrix的matrix,那么我们可以仅使用post系列方法或者pre系列方法的其中一种来完成各种变换操作,因为此时我们仅使用pre或者post方法来定义各种变换次序。
但是如果我们得到的matrix是一个非单元矩阵,并且该matrix还未调用setMatrix应用到实际中,此时我们可能同时需要pre和post方法来实现我们所需要的变换,例如C是通过getMatrix得到的并满足之前描述的matrix,此时如果我想在现有的变换之前进行某些变换,此时只有pre方法可以做到,假如C是一个执行过postScale操作的matrix,此时我想在postScale之前进行平移,那只有调用preTranslate,这样当调用setMatrix的时候会先进行preTranslate操作,再进行postScale操作。必须这么做的前提就是先scale后translate和先translate后scale得到的是不同的变换效果。
个人觉得以上分析结果很可能存在一些偏差,如哪位大侠发现错误还请麻烦指正~~
相关文章推荐
- Android中Matrix的pre post set方法理解(转载来源:Linux社区 作者:zjmdp)
- Android中Matrix的pre post set方法理解
- Android中Matrix的pre post set方法理解
- Android中Matrix的pre post set方法理解
- Android中Matrix的pre post set方法理解(转载来源:Linux社区 作者:zjmdp)
- Android Matrix的 pre post set方法的理解(zz)
- Android中Matrix的pre post set方法理解
- Android 图形处理特效 Matrix 的set 、 pre、post方法的区别和使用
- 【Android】图形处理特效 Matrix 的set 、 pre、post方法的区别和使用
- Android中Matrix的set、pre、post的区别
- Android中的Matrix,以及set,pre和post的区别
- 详谈Android中Matrix的set、pre、post的区别
- Android中Matrix的set、pre、post的区别
- Matrix 中的post 和pre 和set 方法的区别 以及Canvas中的方法
- android Matrix的pre、post、set三种变形方式
- Matrix 中的post 和pre 和set 方法的区别 以及Canvas中的方法
- 关于Android Matrix pre post 的理解
- Matrix 中的post 和pre 和set 方法的区别 以及Canvas中的方法
- Android中ActionBar的setDisplayHomeAsUpEnabled、setHomeButtonEnabled和setDisplayShowHomeEnabled方法的理解
- 对android中ActionBar中setDisplayHomeAsUpEnabled和setHomeButtonEnabled和setDisplayShowHomeEnabled方法的理解