用 Matrix 来做图片旋转,平移

简单介绍

Matrix 是个 3x3 的几何变换矩阵,主要用来给物体做旋转,缩放,平移,其实说是作用在物体上,本质还是对物体在坐标系中的坐标点做的计算。

用 Matrix 来控制图片的几何变换

Matrix 提供的方法主要分 3 类方法,每个类分别有平移,旋转,缩放,倾斜操作。

  • set- 类方法

如果变换只涉及一种,并且是静态展示不是动画效果,就可以用 set 的方式控制。如果是要做一个动画效果,就要考虑用 pre, post 系列了。

  • pre- 类方法

对应到矩阵运算的左乘,即 Matrix 对象左乘变化量。

  • post- 类方法

对应到矩阵运算的右乘,即 Matrix 对象右乘变化量。

我对 pre 和 post 的理解是 ,例如先做旋转就用 preRotate 后做平移就用 postTranslate,对应到实际使用上,我是这么用的。
首先我需要确定好图片的一个初始位置,分为两个步骤,1.要调整一下角度,2.要调整一下位置,

//我的期望是先按图片自身的中心点旋转 90 度,再进行平移
//但如果先平移,再旋转的话,结果就不是我期望的,显然组合变换存在一定先后顺序关系。
//但我觉得不应啊,后面再深入了解。这里先记住组合变换要注意顺序
matrix.preRoate(90, bitmap.getWidth()/2, bitmap.getHeight()/2);
matrix.postTranslate(10, 10);

确定好初始位置后,接下来主要是让它动起来(因为要求做的是动画),这步重点在于确定期望的终点位置,并计算变换过程中的位置(这就要回到高中数学了)。需要注意的是,平移方法的入参用的是差量,dx, dy。也就是说如果要从 A 点移动到 B 点,需要知道的不是 B 点的坐标,而是 A 到 B 的距离差,并且是带方向的那种。

所以后面的逻辑基本就是不停的计算差值,然后在按顺序的先旋转,后平移。

经过实际调试发现,

  1. pre- 类方法和 set- 类方法的效果一样,但这个可能仅就我写的逻辑来说。
  2. Matrix 方法调用执行的先后顺序不影响结果,也就是说 pre- 类方法可以写在 post- 类方法之后。

经过不断的调试,计算,修正,我实现了一个小指针绕着一段圆弧滑动,并且指针始终指向圆弧圆心的效果。

写在最后

打开 Matrix 类的代码会发现,方法里面调用的都是 native 方法,我估计很大一部分原因是处于性能和效率的考虑把。另外,虽然这次通过调试达到了效果,但如果想掌握 Matrix,本质上还是要去掌握矩阵变换的东西(也就是大学里的数学基础),我想这样才能解决为什么先平移再旋转效果就不行的问题。

参考内容

深入理解 Android 中的 Matrix

你可能感兴趣的:(用 Matrix 来做图片旋转,平移)