Files
AndroidNote/CustomView/Advance/[9]Matrix_Basic.md

158 lines
6.9 KiB
Markdown
Raw Normal View History

2016-06-11 21:33:47 +08:00
# Matrix基础
2016-06-06 17:39:12 +08:00
2016-07-20 06:10:39 +08:00
2016-07-17 23:52:31 +08:00
前面讲了四篇 Path 相关的内容,本次终于要到了大家期盼已久的黑客帝国!
2016-06-06 17:39:12 +08:00
2016-06-26 21:16:22 +08:00
![](http://ww1.sinaimg.cn/large/005Xtdi2jw1f4oyx5i8wbj308c0bj3zz.jpg)
2016-06-10 02:41:55 +08:00
2016-07-21 04:10:59 +08:00
## 一、Matrix作用
2016-07-20 17:05:00 +08:00
2016-07-22 04:01:04 +08:00
如题,本篇的主角是 Matrix看起来大概是下面这样:
![](http://latex.codecogs.com/png.latex?
$$
\\left [
\\begin{matrix}
MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\\\
\\\\
MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\\\
\\\\
MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2
\\end{1}
\\right ]
$$)
2016-06-10 02:41:55 +08:00
2016-07-23 01:01:59 +08:00
它在我们在之前的很多文章中都提及过但并没有仔细的介绍过从本篇开始终于要正式介绍它了这个在2D和3D绘图中十分重要的角色Matrix(_本篇讲述的是graphics中的Matrix_)
2016-06-06 17:39:12 +08:00
2016-07-20 17:05:00 +08:00
### Matrix 的翻译过来是矩阵模型。和其释义相同Matrix是一个矩阵其作用则是一个模型一个控制视图状态的模型。
2016-06-06 17:39:12 +08:00
2016-07-23 01:01:59 +08:00
Matrix 作为一个模型,主要功能就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子:
2016-07-22 03:54:40 +08:00
2016-07-22 04:01:04 +08:00
我的的手机屏幕作为物理设备其坐标系肯定是从左上角开始的而且是不会改变的但我们在开发的时候通常不会使用这一坐标系而是使用内容区的坐标系通常情况下我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离所以两者是不重合的我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制Matrix在此处的作用就是转换这些数值。
2016-07-22 03:54:40 +08:00
2016-07-22 04:01:04 +08:00
>
假设通知栏高度为20像素导航栏高度为40像素,那么我们在内容区的(00)位置绘制一个点,最终就要转化为在实际坐标系中的(060)位置绘制一个点。
2016-07-22 03:54:40 +08:00
![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg)
2016-07-20 17:05:00 +08:00
2016-07-21 04:10:59 +08:00
## 二、Matrix基本原理
2016-06-27 19:55:23 +08:00
2016-07-19 03:47:11 +08:00
Matrix 本质是一个 3x3 的矩阵里面有9个数值分别用于控制视图的不同属性大致如下:
2016-07-20 06:14:11 +08:00
![](http://latex.codecogs.com/png.latex?
2016-07-20 06:10:39 +08:00
$$
\\left [
\\begin{matrix}
MSCALE\\_X & MSKEW\\_X & MTRANS\\_X \\\\
\\\\
MSKEW\\_Y & MSCALE\\_Y & MTRANS\\_Y \\\\
\\\\
MPERSP\\_0 & MPERSP\\_1 & MPERSP\\_2
\\end{1}
\\right ]
$$)
2016-06-26 20:49:05 +08:00
2016-07-21 04:09:29 +08:00
2016-07-20 02:46:31 +08:00
序号 | 名称 | 对应单词 | 摘要
-----|----------|-------------|--------------
0 | MSCALE_X | scale | 控制X坐标 缩放,旋转
1 | MSKEW_X | skew | 控制X坐标 错切,旋转
2 | MTRANS_X | transfer | 控制X坐标 位移
3 | MSKEW_Y | skew | 控制Y坐标 错切,旋转
4 | MSCALE_Y | scale | 控制Y坐标 缩放,旋转
5 | MTRANS_Y | transfer | 控制Y坐标 位移
6 | MPERSP_0 | perspective | 控制透视 (绕Y轴旋转)
7 | MPERSP_1 | perspective | 控制透视 (绕X轴旋转)
8 | MPERSP_2 | perspective | 控制透视 (通常为1)
2016-07-20 04:04:36 +08:00
2016-07-20 16:55:36 +08:00
从上表中可以看出一些内容下面我们看一下2D画布中常用的四种操作(translate, scale, rotate, skew)都是由哪些参数控制的。
2016-07-20 04:04:36 +08:00
2016-07-20 16:48:25 +08:00
![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f60gwrhlnyj30c008zdgy.jpg)
2016-07-22 23:21:08 +08:00
![](http://ww2.sinaimg.cn/large/005Xtdi2jw1f633hvklfnj30c008zdge.jpg)
2016-07-20 04:04:36 +08:00
2016-07-20 16:52:48 +08:00
>
2016-07-21 03:09:37 +08:00
**从上图可以看到最后三个参数是控制透视的这三个参数主要在3D效果中运用通常为(0, 0, 1),不在本篇范围内,暂不过多叙述,会在之后对文章中详述其作用。**
2016-07-20 04:04:36 +08:00
2016-07-22 04:01:04 +08:00
### 常见误解
2016-07-21 04:09:29 +08:00
2016-07-22 02:47:02 +08:00
在写本文之前,我翻阅很多介绍 Matrix 的文章和官方文档但其中文的搜索结果令我很悲伤大部分的中文文章对Matrix都存在误解,想当然的创造出一些错误的理论, 导致很多(抄袭)的文章都是这一错误的理论,不知道要坑害多少小白,常见的错误理论有:
2016-07-21 04:09:29 +08:00
2016-07-21 04:14:15 +08:00
**1.认为Matrix最下面的一行的三个参数(MPERSP_0、MPERSP_1、MPERSP_2)没有什么太大的作用,在这里只是为了凑数。**
2016-07-21 04:09:29 +08:00
2016-07-21 04:14:15 +08:00
> **实际上最后一行参数在3D变换中有着至关重要的作用这一点会在后面中Camera一文中详细介绍。**
2016-07-21 04:09:29 +08:00
2016-07-21 17:15:35 +08:00
**2.最后一个参数MPERSP_2被解释为scale**
2016-07-21 04:09:29 +08:00
2016-07-21 04:14:15 +08:00
> **的确更改MPERSP_2的值能够达到类似缩放的效果但这是因为齐次坐标的缘故并非这个参数的实际功能。**
2016-07-21 04:09:29 +08:00
2016-07-22 07:26:20 +08:00
## 三、Matrix优缺点
Matrix在view、canvas、path、bitmap等很多地方都有应用可以说运用十分广泛优点突出但也存在一定但缺点下面简要介绍一下Matrix相关优缺点。
### 优点
2016-07-23 00:58:04 +08:00
* 计算方便,利用矩阵的计算法则可以方便的将一个坐标系转换为另一个坐标系中。
* 存储量小Matrix仅有九个数值却包含了大部分画布的状态信息。
* 方便复用如果有重复的需要相同状态的地方只需要构造好一个Matrix设置给不同的画布即可保证每一个画布的状态都是相同的无需给每一个画布都重新构造状态。另外如果一张图片需要以不同的状态展示可以只放一张资源图片然后构造出不同的Matrix进行设置即可。
### 缺点
* 稍有门槛Matrix计算运用了线性代数的知识有一定的门槛虽然封装了比较好的方法但对于大部分人来说pre、post、set有啥区别还是傻傻分不清楚更不用说仿射投影齐次坐标这些让人头大的概念。
* 容易混淆Matrix的方法变换 和 Canvas的方法变换 稍微有所差别, 如果按照Canvas的变换方法直接构造Matrix最后的结果可能会与你想象的有所差别。
2016-07-22 14:47:51 +08:00
2016-07-22 07:26:20 +08:00
2016-07-22 02:47:02 +08:00
Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,不过我会尽量用通俗易懂的方式来帮助大家理解它。
2016-07-22 03:54:40 +08:00
## 四大常用操作
2016-07-22 02:47:02 +08:00
2016-07-22 03:54:40 +08:00
我们之前在 [Canvas之画布操作](https://github.com/GcsSloop/AndroidNote/blob/master/CustomView/Advance/%5B3%5DCanvas_Convert.md) 中讲解过的四种画布操作(translate, scale, rotate, skew)这些操作的核心就是改变Matrix的数值接下来我们看看这四种操作都会影响到哪些数值。
2016-07-22 03:42:32 +08:00
2016-07-22 02:47:02 +08:00
2016-07-21 04:09:29 +08:00
2016-07-20 17:05:00 +08:00
2016-07-20 04:04:36 +08:00
2016-07-20 01:45:13 +08:00
2016-07-21 03:09:37 +08:00
## Matrix方法表
2016-07-21 04:09:29 +08:00
Matrix 有很多常用和不常用的方法,
2016-07-21 03:09:37 +08:00
方法类别 | 相关API | 摘要
-----------|---------------------------------------------------------|------------------------
基本方法 | equals hashCode toString toShortString | 比较、 获取哈希值、 转换为字符串
2016-07-23 00:58:04 +08:00
数值操作 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值
数值计算 | mapPoints mapRadius mapRect mapVectors | 计算变换后的数值
2016-07-21 03:09:37 +08:00
设置(set) | setConcat setRotate setScale setSkew setTranslate | 设置变换
前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换
后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换
特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作
矩阵相关 | invert isAffine isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 ...
2016-06-13 17:01:01 +08:00
2016-06-11 21:46:30 +08:00