Android Matrix基本原理方法

最近做了个图片阅读器相关的需求,其中不乏涉及到了图片的移动、缩放、拖拽等操作。虽然如期完成了业务需求,但是在开发过程中也并非得心应手,其中一个很重要的原因就是开发过程中大量用到了Matrix等的操作,但由于对Matrix的使用及理解不够深刻,才导致开发过程中抓襟见肘,好些知识点都是在边开发边Google的情况下完成的。俗话说的好:基础不牢,地动山摇。这句话在此开发中着实令我印象深刻。所以这也是我写这边文章的一个重要原因。就是希望自己完成每个需求点后多做技术沉淀分析;另外,也希望以此为鉴,把基础知识打牢靠,这样才能在创建更加伟岸雄壮的高层建筑。站的更高,看的更远...

好了言归正传。

解读Matrix(矩阵)之前就得先回顾下矩阵的知识点:由于Android中接触到的Matrix变化基本上是三阶矩阵,故在此也拿三阶矩阵举例。

我们先来看看Android的Matrix长什么样子:

通过查看Matrix类的源码也看得知矩阵涉及到四种常用的变换:缩放(scale)、平移(translate)、旋转(rotate)、错切(skew)

下面我们看一下四种变换都是由哪些参数控制的(图片引自GcsSloop):

通过上图可以看到,最后的三个参数是控制透视的,主要用于3D效果中,一般是(0,0,1)  ,在此不做详细介绍。

在进行四种变换及Matrix常用方法之前,我们先弄清楚几个基础结论(假设原矩阵为M,变换后的矩阵为M',平移矩阵为T(举例),I为单位矩阵):

1、set用于设置Matrix中的值
2、pre 前乘(也叫右乘):M' = M * T
3、post 后乘(也叫左乘):M' = T * M
4、矩阵满足乘法结合律:(A*B)*C = A*(B*C)
5、矩阵不满足乘法交换律:A*B ≠ B*A
6、矩阵与单位矩阵相乘,矩阵不变:M = M * I

以上结论,非常重要,在此就不做证明了,可以自行研究,但需要说明的是每种矩阵变换Android都提供了三种操作方式:

set、pre、post,但由于矩阵不满足乘法交换律,所以前乘跟后乘是需要严格区分的。

有了以上结论说明作为铺垫,那我们接下来就可以比较顺畅的分析最常用的四种变换及其他常用的方法。

  • 缩放(scale):

   

    

缩放是由矩阵中的MSCALE_X(对应k1)、及MSCALE_Y(对应k2)这两个参数来决定的,他们分别代表x轴的缩放跟y轴的缩放。

用矩阵表示如下:

如下图(x,y轴均缩放0.5倍):

各实例分析如下:

缩放常用的方法如下:

原图(各实例共用):

1、原点处(这里以屏幕左上角作为原点)对图片进行缩放[dx = 2.0f, dy = 2.0f]:

​postScale(float dx, float dy)​

下面说一下Scale缩放的特殊情况:

<1> 当dx=-1,dy=1时,图片向左翻转;

<2> 当dx=1,dy=-1时,图片向上翻转;

<3> 当dx=-1,dy=-1时,图片旋转180度。

如下图所示(图片引自LoongWind)

scale

2、<1>在点(px,py)处对图片进行缩放[sx = 2.0, sy = 2.0, px = 200, py = 200]:

postScale(float sx, float sy, float px, float py) 

     <2>在点(px,py)处对图片进行缩放[sx= 2.0, sy= 2.0, px= -200, py= -200]:

通过查看图片可以得知,点(px,py)是根据图片的绝对坐标来缩放的。

缩放的前乘与之类似,在此不做过多介绍。

  • 平移(translate)

用矩阵表示:

图例:

对图片进行平移[dx = 200, dy = 200]:

preTranslate(float dx, float dy)
postTranslate(float dx, float dy)

  • 旋转(rotate)

假定一个点 A(x0, y0) ,距离原点距离为 r, 与水平轴夹角为 α 度, 绕原点旋转 θ 度, 旋转后为点 B(x, y) 如下:

用矩阵表示:

1、原点处旋转[degree=30]:

postRotate(float degrees)

2、在点(px,py)处旋转[degree=30,px=200,py=200] :

postRotate(float degrees, float px, float py)

  • 错切(skew)

错切包括水平错切、垂直错切、复合错切三种,原理类似,现以水平错切为例进行说明:

用矩阵表示:

图例:

1、以原点进行错切[kx=0.3f,ky=0]

postSkew(float kx, float ky)

2、以某点(px,py)处进行错切,注意当ky=0时,py无效,x轴同理[kx=0.3f,ky=0,px=-800,py=-800]

postSkew(float kx, float ky, float px, float py)

本文对Matrix的四种变换做了基本介绍,在前人的基础上做了下总结,根据demo整理了下自己的思路。下篇文章介绍下Matrix混合变换,及Matrix其他的方法介绍。

参考:https://blog.csdn.net/cquwentao/article/details/51445269

参考:http://www.gcssloop.com/customview/Matrix_Basic

参考:https://cloud.tencent.com/developer/article/1198164

发布了95 篇原创文章 · 获赞 195 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/u012440207/article/details/88076087