Android Xfermode 与 Matrix

画笔风格(Xfermode)


矩阵变换(Matrix)

在 Android 中,对图片的处理需要使用到 Matrix 类,Matrix 是一个 3 x 3 的矩阵,他对图片的处理分为四个基本类型:

  • Translate————平移变换
  • Scale————缩放变换
  • Rotate————旋转变换
  • Skew————错切变换

在 Android 的 API 里对于每一种变换都提供了三种操作方式:

  • set(用于设置 Matrix 中的值)
  • post(后乘,根据矩阵的原理,相当于左乘)
  • pre(先乘,相当于矩阵中的右乘)

默认时,这四种变换都是围绕(0,0)点变换的,当然可以自定义围绕的中心点,通常围绕中心点。

平移变换

在对图片处理的过程中,最常用的就是对图片进行平移操作,该方法为 setTranslate(),平移意味着在 x 轴和 y 轴上简单地移动图像。
setTranslate 方法采用两个浮点数作为参数,表示在每个轴上移动的数量。
第一个参数是图像将在 x 轴上移动的数量,而第二个参数是图像将在 y 轴上移动的数量。
在 x 轴上使用正数进行平移将向右移动图像,而使用负数将向左移动图像。
在 y 轴上使用正数进行平移将向下移动图像,而使用负数将向上移动图像。

缩放变换

Matrix 类中另一个有用的方法是 setScale 方法。
它采用两个浮点数作为参数,分别表示在每个轴上所产生的缩放量。
第一个参数是x轴的缩放比例,而第二个参数是y轴的缩放比例,如:

1
matrix.setScale(1.5f,1);

旋转变换

比较复杂的就是图片的旋转了,内置的方法之一是 setRotate 方法。
它采用一个浮点数表示旋转的角度。
围绕默认点 (0,0),正数将顺时针旋转图像,而负数将逆时针旋转图像,其中默认点是图像的左上角,如:

1
2
Matrix matrix = new Matrix();
matrix.setRotate(15);

另外,也可以使用旋转的角度及围绕的旋转点作为参数调用 setRotate 方法。选择图像的中心点作为旋转点,如:

1
matrix.setRotate(15,bmp.getWidth()/2,bmp.getHeight()/2);

错切变换

在数学上又称为 Shear mapping(可译为“剪切变换”)或者 Transvection(缩并),它是一种比较特殊的线性变换。
错切变换的效果就是让所有点的 x 坐标(或者 y 坐标)保持不变,而对应的 y 坐标(或者 x 坐标)则按比例发生平移,且平移的大小和该点到 x 轴(或 y 轴)的垂直距离成正比。
错切变换,属于等面积变换,即一个形状在错切变换的前后,其面积是相等的。
对于程序中,一个特别有用的方法对是 setScale 和 postTranslate,它们允许跨单个轴(或者两个轴)翻转图像。
如果以一个负数缩放,那么会将该图像绘制到坐标系统的负值空间。由于 (0,0) 点位于左上角,使用 x 轴上的负数会导致向左绘制图像。因此我们需要使用 postTranslate 方法,将图像向右移动,如:

1
2
matrix.setScale(-1, 1);
matrix.postTranslate(bmp.getWidth(),0);

可以在 y 轴上做同样的事情,翻转图像以使其倒置。
通过将图像围绕两个轴上的中心点旋转180°,可以实现相同的效果,如:

1
2
matrix.setScale(1, -1);
matrix.postTranslate(0, bmp.getHeight());

链接

传送门:GitHub