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.rhkb.cn/news/233875.html

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

相关文章

普中STM32-PZ6806L开发板(有点悲伤的故事)

简介 关于我使用 普中STM32-PZ6806L做了做了一些实验, 不小心输入12V,导致核心板等被烧坏, 为了利用电路和资源, 搭建了STM32F103CBT6并使用普中STM32-PZ6806L上面没有烧坏的模块的故事。 普中STM32-PZ6806L开发板 这块的STM32F103ZET6部分算是Closed了, 不准备换核…

【FPGA】分享一些FPGA入门学习的书籍

在做FPGA工程师的这些年,买过好多书,也看过好多书,分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

gem5学习(9):构建gem5——Building gem5

目录 一、Requirements for gem5 二、Getting the code 三、Your first gem5 build 1、gem5 binary types 四、Common errors 1、gcc版本过低 2、使用非默认版本的python 3、未安装M4宏处理器 4、Protobuf版本过低 前面的gem5学习(3)—&#xf…

SparkStreaming基础解析(四)

1、 Spark Streaming概述 1.1 Spark Streaming是什么 Spark Streaming用于流式数据的处理。Spark Streaming支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ和简单的TCP套接字等等。数据输入后可以用Spark的高度抽象原语如:map、…

差分信号,光耦介绍

差分信号 原理 差分信号是由双绞线进行通讯的,为什么选择双绞线呢?因为这其中有个电磁学的原理,在通讯过程中噪声一般来自外界天气或其它元器件的电磁干扰导致导线中的电流变得不稳定,如2.3v是低电平突然被噪声干扰会造成信号增…

IOS:Safari无法播放MP4(H.264编码)

一、问题描述 MP4使用H.264编码通常具有良好的兼容性,因为H.264是一种广泛支持的视频编码标准。它可以在许多设备和平台上播放,包括电脑、移动设备和流媒体设备。 使用caniuse查询H.264兼容性,看似确实具有良好的兼容性: 然而…

【设计模式之美】面向对象分析方法论与实现(二):需求到接口实现的方法论

文章目录 一. 进行面向对象设计1. 划分职责>需要有哪些类2. 定义类及其属性和方法3. 定义类与类之间的交互关系4. 将类组装起来并提供执行入口 二. 如何进行面向对象编程?1. 接口实现2. 辩证思考与灵活应用 【设计模式之美】面向对象分析方法论与实现&#xff08…

window mysql5.7 搭建主从同步环境

window 搭建mysql5.7数据库 主从同步 主节点 配置文件my3308.cnf [mysql] # 设置mysql客户端默认字符集 default-character-setutf8mb4[mysqld] server-id8 #server-uuidbc701be9-ac71-11ee-9e35-b06ebf511956 log-binD:\mysql_5.7.19\mysql-5.7.19-winx64\mysql-bin binlog-…

jvm虚拟机初识

JVM Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪…

云解析迁移【腾讯云到阿里云】

一、关闭 DNSSEC 域名如有配置DNSSEC,请先到域名注册商处关闭DNSSEC,等迁移完成后,再参考DNSSEC设置方法进行配置。如域名未配置DNSSEC,则忽略此步骤。 解析数据准备: 请在原DNS服务商处导出解析记录,并按…

眼镜用超声波清洗机洗会有伤害吗?这些超声波清洗机适合清洗眼镜

用超声波清洗机洗眼镜是一种非常好的选择,超声波清洗机通过高频振动,将眼镜上的污渍、灰尘等清洗干净,比手洗更彻底、更高效。然而,有些人担心超声波清洗机会对眼镜造成伤害。实际上,这种担心是多余的。超声波清洗机在…

Java版直播商城:电商源码、小程序、三级分销及 免 费 搭 建 方案

一、技术选型 java开发语言:java是一种跨平台的编程语言,适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。 spring boot框架:spring boot是一个快速构建spring应用的框架,简化了开发过程&#xf…

SpringBoot集成Camunda

一&#xff1a;pom.xml 因camunda集成SpringBoot对SpringBoot的版本和JDK的版本都有一定的要求&#xff0c;所以这里贴个完整的依赖。可以去官网找每个SpringBoot的版本对应的camunda版本。 <?xml version"1.0" encoding"UTF-8"?> <project x…

一分钟带你了解深度学习算法

深度学习是一种受到生物学启发的机器学习方法&#xff0c;其目标是通过构建多层神经网络来模拟人脑的工作原理。它在过去几十年来取得了巨大的进展&#xff0c;并在图像识别、语音识别、自然语言处理等领域取得了突破性的成果。 深度学习的核心思想是模仿人脑的神经网络。人脑中…

flex弹性盒子常用的布局属性详解

想必大家在开发中经常会用到flex布局。而且还会经常用到 justify-content 属性实现分栏等等 接下来给大家分别讲一下 justify-content 的属性值。 以下是我敲的效果图大家可以清晰看出区别 space-between 属性值可以就是说两端对齐 space-evenly 属性值是每个盒子之间的…

欧洲编程语言四巨头

从左往右&#xff0c;依次是 尼克劳斯沃斯 (Niklaus Wirth)&#xff0c;迪杰斯特拉&#xff08;Edsger Dijkstra&#xff09;&#xff0c;霍尔&#xff08;Tony Hoare&#xff09; 尼克劳斯沃斯 (Niklaus Wirth) 瑞士人&#xff0c;一生发明了8种编程语言&#xff0c;其中最著…

大数据深度学习长短时记忆网络(LSTM):从理论到PyTorch实战演示

文章目录 大数据深度学习长短时记忆网络&#xff08;LSTM&#xff09;&#xff1a;从理论到PyTorch实战演示1. LSTM的背景人工神经网络的进化循环神经网络&#xff08;RNN&#xff09;的局限性LSTM的提出背景 2. LSTM的基础理论2.1 LSTM的数学原理遗忘门&#xff08;Forget Gat…

PHP入门指南:从小白到编程达人

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读PHP语法注释变量输出定界符数据类型var_dump() 方法 PHP弱类型弱类型比较内置…

Python自动化办公之PDF拆分

今天我们继续分享真实的自动化办公案例&#xff0c;希望各位 Python 爱好者能够从中得到些许启发&#xff0c;在自己的工作生活中更多的应用 Python&#xff0c;使得工作事半功倍&#xff01; 需求 需要从 PDF 中取出几页并将其保存为新的 PDF&#xff0c;为了后期使用方便&a…

关于车规级齐纳二极管MMBZ5V6ALT1G 它又有什么作用?

MMBZ5V6ALT1G是一款双单片硅齐纳二极管专为需要瞬态过电压保护能力的应用而设计&#xff0c;它们适用于电压和ESD敏感设备&#xff0c;如计算机、打印机、商用机器、通信系统、医疗设备和其他应用。它们的双结共阳极设计仅使用一个封装即可保护两条独立的线路&#xff0c;该器件…