说到Android的图形变换就不得不提Matrix,包括安卓在内的很多计算机图形的变换都是基于矩阵来进行的,常规的操作如平移,旋转,缩放等操作,都是通过矩阵之间的相加,前乘、后乘来实现的。
那么首先,我们就必须知道,为什么Android中的Matrix是一个3*3的坐标系,而不是4*4或者2*2呢。我们知道,如果要实现平移变换,只需要对对象的x,y值进行操作即可
写成矩阵的形式就是
那么如果想要实现缩放呢
可以看到,缩放其实就是对x和y值进行了一定系数的放大,这里就引入了二维坐标系
同理,针对图形的旋转操作
就是对X,Y值进行了三角函数运算
那如果,想要同时实现旋转,缩放和平移怎么办,对象平移是加法,而旋转和缩放使用的是乘法。
划重点:那么有没有一种方法能同时实现旋转、缩放、平移呢?
这里,计算机图形学中采用的是升维的方法,就是把二维坐标转换为三维坐标
这样,平移操作就可以表示成:
同理,缩放和旋转:
这就是引入齐次坐标的作用,把各种变换都统一了起来,即 把缩放,旋转,平移等变换都统一起来,都表示成一连串的矩阵相乘的形式。保证了形式上的线性一致性。
至于为什么在X,Y后面添加了1而矩阵不变?这就是齐次坐标系的原因了
对于Android来说,也是同样的道理。这里,还是不免俗套地祭出谷歌的经典图
通过字面的意思我们也能大概猜测出来每个元素代表的意思,其中,这个矩阵是通过bitmap的getmatrix得到的,而且在每个手机中的数值都不同,当我想去探究这个矩阵是如何生成时,奈何底层是c实现的,我们不得而知。