This commit is contained in:
sloop
2016-07-22 04:01:04 +08:00
committed by GitHub
parent 2c0f232460
commit 7055644558

View File

@@ -7,22 +7,37 @@
## 一、Matrix作用
如题,本篇的主角是 Matrix
如题,本篇的主角是 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 ]
$$)
它在我们在之前的很多文章中都提及过但并没有仔细的介绍过从本篇开始终于要正式介绍它了这个在2D和3D绘图中十分重要的角色Matrix(_Android中有两个Matrix分别属于OpenGL 和 graphics 本篇主要讲述的是graphics中的Matrix_)
另外,本篇的重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。
本篇的重点不在于这些方法的讲解,而是帮助大家理解 Matrix 的一些基本概念。
>
### Matrix 的翻译过来是矩阵模型。和其释义相同Matrix是一个矩阵其作用则是一个模型一个控制视图状态的模型。
**Matrix 作为一个模型,主要功能就是数值转换,将一个坐标系中的点映射到另一个坐标系中,举个栗子:**
我的的手机屏幕作为物理设备,其坐标系肯定是从左上角开始的,而且是不会改变的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系,通常情况下,我们的内容区和屏幕坐标系还相差一个通知栏一个标题栏,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制。
我的的手机屏幕作为物理设备,其坐标系肯定是从左上角开始的,而且是不会改变的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系,通常情况下,我们的内容区和屏幕坐标系还相差一个通知栏一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的屏幕坐标系来绘制Matrix在此处的作用就是转换这些数值
假设通知栏高度为20像素导航栏高度为40像素,那么我们在内容区的(00)位置绘制一个点,最终就要转化为在实际坐标系中的(060)位置绘制一个点Matrix在此处的作用就是转换这些数值。
>
假设通知栏高度为20像素导航栏高度为40像素,那么我们在内容区的(00)位置绘制一个点,最终就要转化为在实际坐标系中的(060)位置绘制一个点。
我们知道Android中点视图是可以嵌套的树形结构每一个子View都有自己的坐标系但实际绘制时都应当转换为实际的屏幕坐标系才能正确的绘制所以让每一个子View都有一个Matrix这样每一个View就都拥有了转换坐标的能力可以非常方便的将各自的坐标系中的内容映射到屏幕坐标系中。
>
我们也知道Android中点视图是可以嵌套的树形结构每一个子View都有自己的坐标系但实际绘制时都应当转换为实际的屏幕坐标系才能正确的绘制所以让每一个子View都有一个Matrix这样每一个View就都拥有了转换坐标的能力可以非常方便的将各自的坐标系中的内容映射到屏幕坐标系中。
![](http://ww4.sinaimg.cn/large/005Xtdi2jw1f624vi3eb6j30rs0goab5.jpg)
@@ -70,7 +85,7 @@ $$)
>
**从上图可以看到最后三个参数是控制透视的这三个参数主要在3D效果中运用通常为(0, 0, 1),不在本篇范围内,暂不过多叙述,会在之后对文章中详述其作用。**
## 三、Matrix常见误解
### 常见误解
在写本文之前,我翻阅很多介绍 Matrix 的文章和官方文档但其中文的搜索结果令我很悲伤大部分的中文文章对Matrix都存在误解,想当然的创造出一些错误的理论, 导致很多(抄袭)的文章都是这一错误的理论,不知道要坑害多少小白,常见的错误理论有:
@@ -83,7 +98,7 @@ $$)
> **的确更改MPERSP_2的值能够达到类似缩放的效果但这是因为齐次坐标的缘故并非这个参数的实际功能。**
## 、Matrix原理详解
## 、Matrix原理详解
Matrix 是一个矩阵,肯定会涉及到一些比较麻烦的理论知识,不过我会尽量用通俗易懂的方式来帮助大家理解它。