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应用程序由一些零散的有联系的组件组成…

黑洞数(C语言)

黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。 任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后…

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

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

算法训练营Day36

#Java #动态规划 开源学习资料 Feeling and experiences: 动态规划:01背包理论基础:卡码网题目链接 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料&#xf…

信息收集之子域名收集

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

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

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

StampedLock详解

在现代的Java应用中,同步是一个核心问题,尤其是在高并发环境下。Java提供了多种同步机制,从基本的synchronized关键字到更高级的ReentrantLock。但在Java 8中,引入了一个新的同步原语——StampedLock,它旨在提供更高的…

C#使用Office原生库开发后的运行问题

目录 一、准备 二、测试Office2007 1、直接运行 2、安装VS2009 3、重新在“引用”库 4、安装“包” 5、报错修复 6、小结 三、测试office2010 1、在VS2019中打开原项目 2、添加“包” 3、重新添加引用 4、测试Word功能 5、测试卸掉那两个“包” 6、测试Excel功能…

索引策略-多列索引

一. 前言 当我们对多列索引的理解不够深刻的时候,往往会为每个列创建独立的索引或者按照错误的顺序创建多列索引。 二. 案例说明 问题一: 为每个列创建独立索引 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了,不知道什…

视频号小店入口在哪?需要什么资质?实操详解!

我是电商珠珠 视频号小店于22年7月产生,距今才发展了一年时间。今年正是它风口期正盛的时候,有很多想要入驻的新手还不知道它在哪,都需要什么资质。 接下来我来给大家详细的讲一下。 视频号小店入口 1、手机端 打开vx搜索“视频号开店”…

第二十章 常见的设计模式

文章目录 一、设计模式二、单例模式三、工厂模式四、抽象工厂模式五、适配器模式六、观察者模式七、代理模式八、策略模式九、MVC模式十、组合模式 一、设计模式 什么是设计模式 设计模式是一种固定的解决问题的方式是一套经过代码设计经验总结优化之后的固定的方式是软件工程…

vue2使用富文本wangeditor

安装 npm i wangeditor --save引用 import E from wangeditor;使用 // 富文本初始化initEditor() {this.isEdit true;this.$nextTick(() > {this.editor new E(this.$refs.editorElem); //绑定节点this.editor.config.height 550; //默认高度为 300,设置高度…