一文学会Matrix类的用法
Matrix
是 Android 图形库中的一个重要类,用于执行各种图形变换操作,包括平移、缩放、旋转和错切(剪切)。Matrix
在绘制 Bitmap
、矢量图形以及处理 Canvas
的位置和形状时非常有用。我们可以将 Matrix
视为一个 3x3 的矩阵,它定义了如何将坐标从一种变换状态映射到另一种。
Matrix 的基本操作
1. 平移(Translation)
平移操作用于将图形沿 X 或 Y 轴移动。使用 postTranslate
方法可以在现有变换的基础上添加平移效果。
Matrix matrix = new Matrix();
matrix.postTranslate(dx, dy); // 将图形向右移动 dx,向下移动 dy
2. 缩放(Scaling)
缩放操作用于按比例放大或缩小图形。使用 postScale
可以指定 X 和 Y 方向的缩放比例。
Matrix matrix = new Matrix();
matrix.postScale(sx, sy); // 水平和垂直方向缩放比例分别为 sx 和 sy
可以通过 preScale
在现有变换之前执行缩放操作。
3. 旋转(Rotation)
旋转操作可以旋转图形,通过 postRotate
可以在现有的变换后加上旋转效果。
Matrix matrix = new Matrix();
matrix.postRotate(degrees, px, py); // 以 (px, py) 为旋转中心旋转 degrees 度
4. 错切(Shear)
错切操作可以沿 X 或 Y 轴进行倾斜。
Matrix matrix = new Matrix();
matrix.postSkew(kx, ky); // 设置 X 和 Y 轴的倾斜因子 kx 和 ky
Matrix 的高级用法
1. 使用 setRectToRect 缩放和居中
setRectToRect
是一个高级的矩形变换方法,它可以将源矩形转换到目标矩形,并自动保持宽高比。可以选择 Matrix.ScaleToFit
参数来控制缩放类型。
Matrix matrix = new Matrix();
RectF srcRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
RectF dstRect = new RectF(0, 0, 200, 300);
matrix.setRectToRect(srcRect, dstRect, Matrix.ScaleToFit.CENTER);
2. 复合变换
可以组合多种变换操作,比如先缩放、再旋转、最后平移。Matrix
提供了 pre
和 post
系列方法,允许将操作按不同顺序组合,以产生复合变换。
Matrix matrix = new Matrix();
matrix.postScale(1.5f, 1.5f); // 放大 1.5 倍
matrix.postRotate(45); // 再旋转 45 度
matrix.postTranslate(100, 200); // 最后移动到 (100, 200)
顺序对结果影响很大,因为先缩放、再旋转和平移的效果和先平移、再旋转和平移的效果是不同的。
Matrix 的实战示例
假设我们有一个 Bitmap
,需要将它按照固定宽高比缩放,并居中绘制到一个指定的 RectF
区域。
public void drawBitmapWithMatrix(Canvas canvas, Bitmap bitmap, RectF targetRect) {// 定义源矩形,即 Bitmap 的边界RectF srcRect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());// 设置 Matrix 进行缩放和平移Matrix matrix = new Matrix();matrix.setRectToRect(srcRect, targetRect, Matrix.ScaleToFit.CENTER); // 保持宽高比缩放// 旋转 45 度并平移matrix.postRotate(45, targetRect.centerX(), targetRect.centerY());matrix.postTranslate(50, 50);// 绘制 Bitmapcanvas.drawBitmap(bitmap, matrix, null);
}
示例解析
- setRectToRect:
- 将 Bitmap 的源矩形 srcRect 缩放到 targetRect 目标区域内,保持宽高比,且居中。
- 旋转和平移:
- 在缩放后的 Matrix 上旋转 45 度,以目标区域的中心为旋转中心,然后再平移 (50, 50)。
- 绘制:
- 使用 canvas.drawBitmap 方法,结合 Matrix 绘制出变换后的 Bitmap。
常用方法概览
方法 | 说明 |
---|---|
setTranslate(dx, dy) | 设置平移变换 |
setScale(sx, sy) | 设置缩放变换 |
setRotate(degrees) | 设置旋转变换 |
setSkew(kx, ky) | 设置错切变换 |
postTranslate(dx, dy) | 追加平移变换 |
postScale(sx, sy) | 追加缩放变换 |
postRotate(degrees) | 追加旋转变换 |
postSkew(kx, ky) | 追加错切变换 |
setRectToRect(src, dst, scaleToFit) | 将源矩形变换到目标矩形,保持比例 |
使用 Matrix
可以极大地提高对图形变换的控制,特别是在 Android 绘图系统中。