Android Matrix (三)矩阵组合和应用变换

在 Android 开发中,Matrix 类不仅提供了 mapPoints 方法来变换点坐标,还提供了多种其他用法,使其成为处理图像和视图变换的强大工具。以下是 Matrix 类的一些关键用法:
在这里插入图片描述

1. 变换方法

  • setTranslate(float dx, float dy): 设置矩阵为平移矩阵。
  • setScale(float sx, float sy, float px, float py): 设置矩阵为缩放矩阵,pxpy 为缩放的轴心。
  • setRotate(float degrees, float px, float py): 设置矩阵为旋转矩阵,degrees 为旋转角度,pxpy 为旋转的轴心。
  • setSkew(float kx, float ky, float px, float py): 设置矩阵为倾斜矩阵,kxky 为倾斜角度,pxpy 为倾斜的轴心。

2. 组合和应用变换

  • postConcat(Matrix other): 后置连接另一个矩阵,可以用于组合多个变换。
  • preConcat(Matrix other): 前置连接另一个矩阵,同样用于组合变换,但顺序与 postConcat 相反。
  • setConcat(Matrix a, Matrix b): 将两个矩阵的变换组合起来。

3. 变换应用

  • mapRect(RectF rect): 变换矩形区域。
  • mapVectors(float[] vecs): 变换向量而不涉及位移。
  • mapRadius(float radius): 变换圆的半径,常用于变换圆形或椭圆。

4. 矩阵操作

  • reset(): 重置矩阵为单位矩阵。
  • set(Matrix src): 设置当前矩阵与指定矩阵相同。
  • invert(Matrix inverse): 计算当前矩阵的逆矩阵。

5. 辅助方法

  • isIdentity(): 检查矩阵是否为单位矩阵。
  • rectStaysRect(): 检查矩阵变换后,矩形是否仍然保持为矩形。

6. 与 Canvas 的结合

Matrix 类在结合 Canvas 使用时尤为强大,可用于实现图像、文本和形状的复杂变换效果。

  • canvas.setMatrix(Matrix matrix): 设置画布的变换矩阵。
  • canvas.concat(Matrix matrix): 将画布当前的变换矩阵与另一个矩阵组合。

这些方法使得 Matrix 成为一个多功能且强大的工具,可以在图形处理、动画制作和视图变换中发挥关键作用。通过这些方法的组合使用,开发者可以实现复杂和精确的图形变换效果。接下来将对第2部分重点介绍一下。
在这里插入图片描述

在 Android 的 Matrix 类中,组合变换是一项非常强大的功能。postConcatpreConcatsetConcat 方法允许开发者以灵活的方式组合不同的图形变换。以下是这些方法的详细说明和例子:

1. postConcat(Matrix other)

postConcat 方法将当前矩阵与另一个矩阵相乘,乘法顺序是先应用当前矩阵的变换,然后应用参数中提供的矩阵的变换。

例子

假设您想先旋转一个图像,然后再对其进行缩放:

val matrix = Matrix()
matrix.setRotate(45f) // 旋转45度val scaleMatrix = Matrix()
scaleMatrix.setScale(2f, 2f) // 缩放,x和y都放大两倍matrix.postConcat(scaleMatrix) // 先旋转,再缩放

2. preConcat(Matrix other)

postConcat 相反,preConcat 方法先应用参数中的矩阵变换,然后应用当前矩阵的变换。

例子

假设您想先缩放一个图像,然后再旋转它:

val matrix = Matrix()
matrix.setRotate(45f) // 旋转45度val scaleMatrix = Matrix()
scaleMatrix.setScale(2f, 2f) // 缩放,x和y都放大两倍matrix.preConcat(scaleMatrix) // 先缩放,再旋转

3. setConcat(Matrix a, Matrix b)

setConcat 方法结合两个矩阵的变换,先应用第二个参数 b 的变换,然后是第一个参数 a 的变换。

例子

假设您有两个矩阵,一个用于旋转,另一个用于缩放,您想先缩放后旋转:

val rotateMatrix = Matrix()
rotateMatrix.setRotate(45f) // 旋转45度val scaleMatrix = Matrix()
scaleMatrix.setScale(2f, 2f) // 缩放,x和y都放大两倍val resultMatrix = Matrix()
resultMatrix.setConcat(rotateMatrix, scaleMatrix) // 先缩放,再旋转

综合理解

  • 这三种方法提供了不同的组合变换策略,允许开发者根据需要灵活地控制变换顺序。
  • 变换的顺序对最终结果有着决定性影响。比如,先缩放后旋转与先旋转后缩放会产生截然不同的结果。
  • 理解这些方法的关键在于理解矩阵乘法的顺序以及它如何影响最终的变换效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开发基础(二)

Android开发基础(二) 上篇主要描述了Android系统架构,代码是通过Java表示的; 本篇将从介绍Android组件去理解Android开发,代码将对Java和Kotlin进行对比。 Android组件 Android应用程序由一些零散的有联系的组件组成…

element input组件自动失去焦点问题解决

最近在 Vue3 ElementPlus 中,使用 el-input 组件时,如果设置了 v-model,那么在每次改变内容后后,input 会自动失去焦点,这样会导致用户无法输入多个字符。 一、问题原因 如上图所示,配置项的 Name 和 Cod…

信息收集之子域名收集

渗透测试常见手法和思维 信息收集 简述 信息收集对于渗透测试前期来说是非常重要的,因为只有我们掌握了目标网站或目标主机足够多的信息之后,我们才能更好地对其进行漏洞检测。正所谓,知己知彼百战百胜! 信息收集的方式可以分…

linux下can调试工具canutils编译安装

命令安装只需要 sudo apt-get install canutils 一、下载源码 下载canutils和libsocketcan libsocketcan地址:https://public.pengutronix.de/software/libsocketcan/libsocketcan-0.0.11.tar.bz2 #0.0.11版本 canutils地址:https://public.pengutronix…

【计算机毕业设计】基于springboot的校园跑腿任务管理系统java+vue

校园跑腿管理系统又称“效率鸭”跑腿系统,是在学校进行现代化的信息管理和提供信息服务的基础,引导人们快速、准确地获取快递资源、预约洗浴并对外卖资源进行有效管理的保证。疫情当下,为了减少人员的聚集,因此,迫切需…

索引策略-多列索引

一. 前言 当我们对多列索引的理解不够深刻的时候,往往会为每个列创建独立的索引或者按照错误的顺序创建多列索引。 二. 案例说明 问题一: 为每个列创建独立索引 CREATE TABLE t(c1 INT,c2 INT,c3 INT,KEY(c1),KEY(c2),KEY(c3) );这种索引策略,一般都是由于人们听到一些专家诸…

阳光保险选择OceanBase稳定运行超700天

阳光保险集团成立于 2005 年 7 月,旗下拥有财产保险、人寿保险、信用保证保险、资产管理等多家专业子公司,是全球市场化企业中成长最快的集团公司之一,目前位列中国保险行业前八。随着数字化升级趋势的不断加速,很多企业产生将软硬…

达摩研究院Paraformer-large模型已支持windows

简介 FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD)、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。FunASR提供了便捷的脚本和教程&#xff0…

二十三、关于vite项目中无法使用minio的解决方案

问题背景 项目需要上传大文件,既然是大文件,如果一次性进行读取发送、接收都是不可取的,很容易导致内存问题。所以对于大文件上传,就一定要实现切片上传、断点续传。如果自己实现相对比较麻烦,但好消息是我们的文件服务使用了开源的minio作为对象存储服务,并且minio也提…

OpenGL排坑指南—贴图纹理绑定和使用

一、前言 在OpenGL学习 的纹理这一章中讲述了纹理贴图的使用方式,主要步骤是先创建一个纹理的对象,和创建顶点VAO类似,然后就开始绑定这个纹理,最后在循环中使用,有时候可能还要用到激活纹理单元的函数。然而&#xff…

练习-sizeof()和strlen()

目录 前言解题技巧一、sizeof()练习题1.1 整型数组1.1.1 一维整型数组1.1.2 二维整型数组 1.2 字符数组1.3 字符指针 二、strlen()练习题2.1 字符数组初始化时不包含\02.2 字符数组初始化包含\02.3 字符指针指向字符串常量 总结 前言 最近有点疲倦,啊啊啊&#xff…

电容的基础知识

一、电容单位 电容亦称作“电容量”,是指在给定电位差下的电荷储藏量,记为C,国际单位是法拉(F)。在国际单位制里,电容的单位是法拉,简称法,符号是F,由于法拉这个单位太大…

vue3项目部署到服务器,刚打开没事,一刷新页面就404

vue3项目部署到服务器,刚打开没事,一刷新页面就404 vue3项目,在本地调试时各方面都没毛病,刷新也没毛病,但是,扔到服务器上,第一次打开是正常的,再刷新下就404了,不知道什…

GLES学习笔记---立方体贴图(一张图)

一、首先看一张效果图 立方体贴图 二、纹理坐标划分 如上图是一张2D纹理,我们需要将这个2D纹理贴到立方体上,立方体有6个面,所以上面的2D图分成了6个面,共有14个纹理坐标 三、立方体 上边的立方体一共8个顶点坐标,范围…

地图多点自动缩放,居中,思路和手写

效果如下 多个标记点顺次标记连接起来zoom缩放到合适等级,刚好能放下那么多点视野刚好在正中间 zoom 实现思路 获取多点的最大经纬度点和最小经纬度点(这两个点相距离最远)计算2个这两点之间的距离地图是有比例尺的,根据比例尺…

1.傅里叶处理图片原理和代码实现

在这里首先声明,本文纯粹看了别的博主的文章,觉得博主写的原理清晰明了,容易理解,很详细,在这里写一遍是作为笔记,方便以后再翻看时容易查找。大家可以参考下面这个博文: 图像的傅里叶变换_图像…

SAP OData(二)Association

Entity之间用Association来表示关联关系,可以同CDS view中的Association一起理解。 我们在上次已经建好实体Item的基础上,再建一个Header,其方法的重写也参考Item即可,然后开始本篇的探索。 一,构建Association 1.1…

脑科学与人工神经网络ANN的发展历程与最新研究

本文深入研究了ANN的基本概念、发展背景、应用场景以及与人脑神经网络的关系。 关注TechLead,分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的…

抽奖机制模型及算法

抽奖机制 连抽保底概率模型不中概率加大模型(抽卡保底) 抽奖概率为n%,在达到某次次数后,每次概率比上次高m%,直至达到保底次数(概率累加和为100%),当抽到极品道具时候,…

网络传输(TCP)

前言 我们tcpdump抓包时会看到除报文数据外,前面还有一段其他的数据,这段数据分为两部分,ip包头(一般20字节)和tcp包头(一般20字节),一般这两个头长度和为40,我们直接跳…