虽说以前学习过线性代数和图形学原理,但是在实际中碰到matrix还是疑惑了好一阵子,今天通过向同事请教终于找到一点门路,特总结如下:
Matrix主要用于对平面进行缩放,平移,旋转以及倾斜操作,为简化矩阵变换,Android封装了一系列方法来进行矩阵变换,其中包括pre系列方法:preScale,preTranslate,preRotate,preSkew,set系列方法:setScale,setTranslate,setRotate,setSkew,post系列方法:postScale,postTranslate,postRotate,postSkew。
通过将变换矩阵与原始矩阵相乘来达到变换的目的,例如:
平移:
旋转:
缩放:
有一点要说明:上图中的原始矩阵为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得到的是不同的变换效果。
个人觉得以上分析结果很可能存在一些偏差,如哪位大侠发现错误还请麻烦指正~~
原贴传送门,虽然不知道是不是第一手,不过写的很好,学到了~~:http://www.linuxidc.com/Linux/2012-07/65035.htm
- 大小: 5.4 KB
- 大小: 7.3 KB
- 大小: 5.7 KB
分享到:
相关推荐
理解并熟练掌握这些方法对于在Android中进行复杂的图像变换和动画操作至关重要,它们可以灵活地组合出各种视觉效果。在开发过程中,正确使用Matrix的`set()`, `pre()`和`post()`方法,能够帮助你创建出更加丰富和...
在Android中,为我们提供一些封装好的方法可以进行一些简单的图像操作,总共分为rotate(旋转),scale(缩放),translate(平移)和skew(倾斜)四种,每一种变换都提供了set, post和pre三种操作方式,除了translate,其他...
每个方法都有`set`、`post`和`pre`三种操作方式,其中`set`会替换当前Matrix,`post`会在当前Matrix后面添加变换,`pre`则在前面添加变换。对于旋转、缩放和倾斜,还可以指定变换的中心点,使变换基于某个特定的位置...
Matrix调用一系列set,pre,post方法时,可视为将这些方法插入到一个队列。当然,按照队列中从头至尾的顺序调用执行。 其中pre表示在队头插入一个方法,post表示在队尾插入一个方法。而set表示把当前队列清空,并且...
通过查看set和post/pre方法的实现,可以学习到如何更新这些元素以实现特定的变换。 六、与其他类的配合 Matrix与其他图形类如Canvas、Paint和Bitmap紧密配合。例如,当在Canvas上绘制时,可以通过Canvas的save()和...
本实例分析主要关注Matrix类在Android中的实际应用,通过具体的代码示例来阐述如何使用Matrix进行图像处理。 Matrix是一个3x3的浮点数矩阵,用于表示几何变换。在Android中,这个矩阵通常用于改变Bitmap或Canvas的...
在本文中,我们将探讨Matrix类的核心概念、常用方法以及在Android图形绘制中的应用。 Matrix类提供了对2D矩阵操作的支持,这些操作包括平移(translation)、旋转(rotation)、缩放(scaling)和斜切(skewing)。...
除了缩放,Matrix还有其他的方法如`postTranslate`(在现有变换后进行平移)、`preRotate`(在现有变换前进行旋转)等,这些方法都遵循相同的预操作(pre-)和后操作(post-)原则。 在实际的图片处理或动画效果中...
Android中的Matrix是一个非常强大的类,它是用于对二维图形进行各种变换处理,比如平移、旋转、缩放、倾斜等操作。它常用于自定义View的绘制中,能够帮助开发者实现复杂的图形变换效果。 Matrix详解中提到,Matrix...
Matrix的每种操作都有set、pre、post三种操作,set是清空队列再添加,pre是在队列最前面插入,post是在队列最后面插入。 pre方法表示矩阵前乘,例如:变换矩阵为A,原始矩阵为B,pre方法的含义即是A*B po
现在我们来深入探讨Matrix在Android中的应用以及相关的知识点。 1. **Matrix类的基本概念**: Matrix是Android图形库中的一个类,它代表了一个2x3的浮点数矩阵,用于执行二维几何变换。这个矩阵包含了六个基本元素...
`post`开头的方法是在现有矩阵之后附加变换,而`pre`开头的方法则是在现有矩阵之前。 2. **组合变换**:在处理复杂的图像变换时,可以使用`set()`或`concat()`方法将多个变换矩阵组合在一起。这使得开发者可以创建...
### Android Matrix 矩阵详解 #### 一、概述 在Android开发中,对图片进行各种变换是一项常见的需求。...理解并掌握`Matrix`类的使用方法,可以帮助开发者更加灵活地处理图像,提升应用的用户体验。
【Android Matrix 源码详解...总的来说,Android Matrix是图像处理的核心工具之一,理解和掌握它的使用能够帮助开发者实现各种图像特效和动画效果。通过深入源码,可以更清晰地了解其内部工作原理,提升图像处理能力。
每种变换都有set、post和pre三种方式,set直接修改Matrix,post是后乘,pre是前乘,它们决定了变换的执行顺序。例如,先旋转后平移,可以使用`Matrix.postRotate(30)`和`Matrix.postTranslate(100,100)`。 UI刷新...
在Android中,Matrix类提供了多种方法来操作这个矩阵,包括设置、预处理和后处理。这些方法会影响矩阵的操作顺序,从而影响最终的图像效果。 1. `set`方法:将当前矩阵重置为单位矩阵,即所有元素为0,主对角线上的...