当前位置: 首页 > news >正文

一文学会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 提供了 prepost 系列方法,允许将操作按不同顺序组合,以产生复合变换。

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);
}
示例解析
  1. setRectToRect
  • 将 Bitmap 的源矩形 srcRect 缩放到 targetRect 目标区域内,保持宽高比,且居中。
  1. 旋转和平移
  • 在缩放后的 Matrix 上旋转 45 度,以目标区域的中心为旋转中心,然后再平移 (50, 50)。
  1. 绘制
  • 使用 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 绘图系统中。


http://www.mrgr.cn/news/60767.html

相关文章:

  • 知名数字中国战略布局与新质生产力培训师讲师培训讲师唐兴通数字经济数字化转型专家教授学者大数据AIGC大模型智能化战略数字时代商业模式创新
  • windows DLL技术-DLL使用共享内存
  • java中对数组进行去重的方法
  • QT 中彻底解决中文乱码问题的指南
  • stable-zero123模型构建指南
  • 深入理解JAVA虚拟机(三)
  • 循环神经网络(Recurrent Neural Network,RNN)
  • 4个硬盘数据修复攻略:让你的数据失而复得。
  • 同一个Service内部调用开启事务
  • Python多语双峰分布
  • 练习LabVIEW第二十四题
  • Unity Job System详解(3)——NativeArray源码分析
  • 100种算法【Python版】第21篇——Wilson算法
  • Java Lock CountDownLatch 总结
  • 李宇皓现身第十届“文荣奖”,allblack造型帅气绅士引关注
  • 加强版 第一节图像二值化定义
  • 四、常量指针其他
  • 信创认证(信创人才考评证书)的含金量?到底有多少?
  • 【Flask】三、Flask 常见项目架构
  • IPV6扩展头部
  • SQL进阶技巧:Hive如何进行更新和删除操作?
  • 自修室预约系统|基于java和小程序的自修室预约系统设计与实现(源码+数据库+文档)
  • 代码随想录第46天|
  • 前端:遇到的面试题
  • Oracle 第10章:触发器
  • Spring MVC介绍