虽说以前学习过线性代数和图形学原理,但是在实际中碰到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

  1. matrix.preScale(0.5f,1);
  2. matrix.preTranslate(10,0);
  3. matrix.postScale(0.7f,1);
  4. matrix.postTranslate(15,0);

等价于:

translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0)

注意:后调用的pre操作先执行,而后调用的post操作则后执行。

set方法一旦调用即会清空之前matrix中的所有变换,例如:

  1. matrix.preScale(0.5f,1);
  2. matrix.setScale(1,0.6f);
  3. matrix.postScale(0.7f,1);
  4. 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

更多相关文章

  1. Android中invalidate()和postInvalidate() 的区别及使用方法
  2. Android(安卓)修改host文件的3种方法
  3. 【Android】定位与解决anr错误记录
  4. 苹果MAC操作系统上搭建Android开发平台环境
  5. Retrofit源码导读
  6. Android(安卓)Service两种启动方式详解(总结版)
  7. 几种判断应用(Android(安卓)App)前后台状态的方法
  8. Android热修复原理探索与实践
  9. Android之Activity生命周期浅析(一)

随机推荐

  1. Android帮助文档(第二部分)开发工具
  2. Android(安卓)时间、日期处理 DateUtils
  3. interpolator
  4. Android自动提示文本框(AutoCompleteText
  5. android 布局随笔----用户登录界面
  6. [6410][android]给android cupcake移植FB
  7. (备忘)Android(安卓)app中调用启动其他应用
  8. MAN
  9. Android控件开发之四----ListView(1)
  10. Android(安卓)设置 横屏 竖屏