图文看懂Android的Matrix原理

news2024/11/15 13:00:30

Matrix结构

在Android开发中,矩阵是一个非常强大且有趣的工具。位于图形库中,android.graphics.Matrix 是一个 3×3 的 float 矩阵,其主要作用是坐标变换。

它的结构大概是这样的:

其中每个位置的数值作用和其名称所代表的的含义是一一对应的:

  • MSCALE_X、MSCALE_Y:控制缩放
  • MTRANS_X、MTRANS_Y:控制平移
  • MSKEW_X、MSKEW_X:控制错切
  • MSCALE_X、MSCALE_Y、MSKEW_X、MSKEW_X:控制旋转
  • MPERSP_0、MPERSP_1、MPERSP_2:控制透视

原理应用

在Android的很多地方其实都使用到了Matrix的方法,比如图片、Canvas、动画等,我们这里以图片为例,假设自定义view,在onDraw函数中我们先绘制一个坐标系,然后来绘制一张图片。

// 平移画布
canvas.translate(mWidth/2,mHeight/2);
mPaint.setStrokeWidth(1);// 恢复画笔默认宽度

// 创建矩阵
mMatrix = new Matrix();
/**
 *  测试的Matrix操作
 */
// 接下来要加入的代码
// 绘制图片
canvas.drawBitmap(mBitmap,mMatrix,null);

1、缩放变换

将点的X轴和y轴方向分别缩放k0和k1倍。x、y的计算结果为 :

用矩阵表示:

为什么要写成三维的矩阵呢,因为android视图实际上就是三维的,只是目前我们才讨论到二维,后面会知道。

效果如图所示:

现在我们使用Matrix自带的setScale方法:

/**
 *  测试的Matrix操作
 */
mMatrix.setScale(0.5f,0.5f);

Log.d("TAG",mMatrix.toString());

// Log
D/TAG: Matrix{[0.5, 0.0, 0.0][0.0, 0.5, 0.0][0.0, 0.0, 1.0]}

2、错切变换

错切变换的效果就是让所有点的x坐标(或者y坐标)保持不变,而对于的y坐标(或者x坐标)则按照比例发生平移。

水平错切

保持y不变,但其x坐标则按比例发生平移。x、y的计算结果为 :

用矩阵表示 :

效果如图所示 :

垂直错切

保持x不变,但其y坐标则按比例发生平移。x、y的计算结果为 :

用矩阵表示 :

效果如图所示 :

当然你也可以同时进行水平错切和垂直错切的变换。

使用示例

现在我们使用Matrix自带的setSkew方法 :

/**
 *  测试的Matrix操作
 */
mMatrix.setSkew(0f,0.5f);
Log.d("TAG",mMatrix.toString());

// Log
D/TAG: Matrix{[1.0, 0.0, 0.0][0.5, 1.0, 0.0][0.0, 0.0, 1.0]}

3、平移变换

假设有坐标为x0,y0,将其点进行平移,移动到点x,y,其x、y计算结果为 :

用矩阵表示 :

效果如图所示 :

使用示例

现在我们使用Matrix自带的setTranslate方法 :

/**
 *  测试的Matrix操作
 */
mMatrix.setTranslate(-200,-200);
Log.d("TAG",mMatrix.toString());

// Log
D/TAG: Matrix{[1.0, 0.0, -200.0][0.0, 1.0, -200.0][0.0, 0.0, 1.0]}

4、旋转变换

假设有一点坐标为x0, y0,距离原点为r,与x轴方向的夹角为α,绕原点旋转θ后,变换为点x, y,其变换前后各点计算结果为 :

用矩阵表示为 :

效果如图所示 :

使用示例

现在我们使用Matrix自带的setRotate方法 :

/**
 *  测试的Matrix操作
 */
mMatrix.setRotate(180);
Log.d("TAG",mMatrix.toString());

// Log
D/TAG: Matrix{[-1.0, -0.0, 0.0][0.0, -1.0, 0.0][0.0, 0.0, 1.0]}

5、透视变换

我们在之前的变换中,一直没有说到最后一行的三个参数MPERSP_0、MPERSP_1、MPERSP_2,这里我们来稍微聊聊这三个参数所表示的透视。我们一般在图像中的一个点将使用如下方式进行表示(x, y, w),而Android中的二维矩阵计算是基于齐次坐标的,齐次坐标要求w的值为1,所以这个点的表示方法就变化为(x/w, y/w, 1)。 透视变换的效果其实类似于投影机的方式,我们看下w=3时,坐标(15,21,3)的效果 :

现在看下(15,21,3)计算出的齐次坐标系坐标(5,7,1)的效果 :

根据这个规则,也就解释了我们在使用过程中修改MPERSP_2参数时,图像会发生的类似缩放的效果,其实就是透视变换的效果。

使用示例

现在我们使用Matrix自带的setValues方法 :

/**
 *  测试的Matrix操作
 */
mMatrix.setValues(new float[]{1, 0, 0, 0, 1, 0, 0, 0, 1.5f});
Log.d("TAG",mMatrix.toString());

// Log
D/TAG: Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.5]}

Matrix前乘与后乘

Matrix前乘与后乘的情况,就类似于线性代数上的情况。

前乘

前乘相当于,原始矩阵乘以变化矩阵。

示例如下: 

mMatrix.reset();
mMatrix.preScale(sx,sy);
mMatrix.preTranslate(tx,ty);

用矩阵表示为 :

后乘

后乘相当于,变化矩阵乘以原始矩阵:

mMatrix.reset();
mMatrix.postScale(sx,sy);
mMatrix.postTranslate(tx,ty);

那么,矩阵的复合操作,就是前乘后乘的组合了,具体的使用的时候注意一下。这里也只是基础的介绍,至少简单知道API参数对应矩阵的位置变化情况了。

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

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

相关文章

基于Java SSM框架实现雁门关风景区宣传网站项目【项目源码】计算机毕业设计

基于java的SSM框架实现雁门关风景区宣传网站演示 Java技术 Java技术它是一个容易让人学会和使用的一门服务器语言。它在编程的过程当中只需要很少的知识就能建立起一个真正的交互站点。对于这个教程来说它并不需要你完全去了解这种语言,只要能快速融入web站点就可以…

互信息法的原理详解

文章目录 互信息法(上)互信息是什么从信息增益角度理解互信息从变量分布一致角度理解互信息 卡方检验与离散变量的互信息法 互信息法(上) 尽管f_regression巧妙的构建了一个F统计量,并借此成功的借助假设检验来判断变…

拼夕夕的拼团模式已经过时!全新拼团模式你可以看一下!

全民拼购,这个新兴的社交电商模式,正以令人惊叹的速度重塑消费者的购物体验。通过与亲朋好友的互动,消费者不仅能享受到购物的乐趣,还能获得实实在在的优惠和福利。 在全民拼购的世界里,用户不再只是孤立的消费者。他们…

给视频添加动图,让视频更具动感与活力

相较于静态图片和文字,GIF动图能更直观地传达信息,为内容增添趣味性。那么,该如何给你的视频添加GIF动图,使其更具吸引力呢?接下来,让我们一起探讨这个话题。 所需工具: 一个【视频剪辑高手】…

CMVAE

use the encoder to obtain two sets of output: 1) (μ i ( m m ) ^{(mm)}_i i(mm)​,σ i ( m m ) ^{(mm)}_i i(mm)​) and 2) (μ i ( m t ) ^{(mt)}_i i(mt)​,σ i ( m t ) ^{(mt)}_i i(mt)​) 作者未提供代码

trilium笔记私有化部署

前言:一直用有道云笔记,随着笔记越多,每次搜索跟打开都感觉没那么顺畅。再考虑到数据安全问题,想着有没私有化部署的笔记,于是开始探索私有化部署笔记。 为知笔记:比较早之前,家里的NAS部署过为…

能见度监测站在交通中有哪些作用

【TH-NJD10】能见度监测站在交通中的作用主要体现在以下几个方面: 提高交通安全:能见度是影响交通安全的重要因素之一。能见度监测站可以实时监测并发布路面或空中的能见度数据,帮助驾驶员和交通管理部门做出安全决策。在低能见度情况下&…

5、MAE:探索视觉预训练模型

目录 1、论文 2、背景与动机 3、回答的问题 4、创新与卖点 5、实现细节 模型框架 具体步骤 简单代码示例 6、一些资料 1、论文 Masked Autoencoders Are Scalable Vision Learnershttps://arxiv.org/pdf/2111.06377.pdf 2、背景与动机 在深度学习和计算机视觉的领域中…

【实用技巧】Steam Wallpaper Engine 壁纸引擎向手机导入壁纸方法

一、内容简介 本文介绍如何使用电脑上的 Wallpaper Engine (Steam 平台中的壁纸引擎)向安卓手机导入并使用壁纸。 二、所需原材料 安卓手机(以笔者使用的华为荣耀50为例)、安装有Steam以及Wallpaper Engine的电脑 三、导入方法…

美摄视频SDK,卓越的视频解决方案

视频已经成为企业传播信息、展示品牌形象的重要工具。然而,高质量的视频制作并不容易,需要专业的技术和设备支持。这就是我们的美摄科技视频SDK发挥作用的地方。作为一家专注于视频技术开发的公司,我们的目标是为企业提供最优质的视频解决方案…

缓存学习实战篇

缓存练习题&#xff08;用户查询操作&#xff09; public List<ShopType> queryAllType() throws JsonProcessingException {//从缓存中查数据String shopTypeJson stringRedisTemplate.opsForValue().get("cache:shopType");//如果缓存命中&#xff0c;if (S…

Linux内存管理:(八)页面迁移

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 可迁移页面 页面迁移机制支持两…

VUE+bpmn.js实现工作流

1、安装bpmn.js npm install bpmn-js7.3.1 // 我安装的版本是7.3.1npm install bpmn-js-properties-panel0.37.2npm install bpmn-moddle7.1.3 npm install --save camunda-bpmn-moddle 2、配置axios&#xff0c;在main.js中引入axios import axios from axiosVue.proto…

Dcoker构建部署Java项目过程

目录 前言 一、打包 二、Docker File文件编写 一个简单的Docker File文件 三、上传文件 四、构建镜像 五、运行 六、端口开放 前言 使用Dcoker构建部署Java项目&#xff0c;发布到服务器 一、打包 我这里打包的是item-service这个module&#xff0c;clean-cpmpile-pa…

【深度学习每日小知识】Logistic Loss 逻辑回归

逻辑回归的损失函数 线性回归的损失函数是平方损失。逻辑回归的损失函数是对数损失&#xff0c;定义如下&#xff1a; L o g L o s s ∑ ( x , y ) ∈ D − y log ⁡ ( y ′ ) − ( 1 − y ) log ⁡ ( 1 − y ′ ) LogLoss\sum_{(x,y)\in D}-y\log(y)-(1-y)\log(1-y) LogLoss…

测试老鸟汇总,接口测试总结与用例编写,一文策底概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、为什么要做接口…

Java SE入门及基础(9)

if选择结构 1. 基本if选择结构 语法 if ( 条件 ){ // 如果条件满足&#xff0c;则执行代码块 //代码块 } 案例 从控制台输入一个整数&#xff0c;如果该数字小于 10 &#xff0c;则输出 10 与该数字的差值。 流程图 代码实现 public class Example1 { public s…

Dart 空感知操作符:??

示例 写了如下代码&#xff1a; var str1 "hello"; var str2 "world"; var result str1 ?? str2.toUpperCase(); //如果str1不为空&#xff0c;则执行后面的语句 print(result); 代码可以正常执行&#xff0c;但是报了如下错误&#xff1a; Warnin…

【网络安全】Nessus部署自动更新和端口权限开放

文章目录 Nessus 自动更新配置Nessus服务端口开放Nessus profession 版本需要开放端口Sensor ProxyTenable Security Center (TSC)Tenable OT Security (TOT)Tenable OT Security Enterprise Manager (IEM)Tenable OT Security Industrial Core Platform (ICP)Tenable OT Secur…

kafka除了作为消息队列还能做什么?

Kafka 最初是为大规模处理日志而构建的。它可以保留消息直到过期&#xff0c;并让各个消费者按照自己的节奏提取消息。 与其之前的竞品不同&#xff0c;Kafka 不仅仅是一个消息队列&#xff0c;它还是一个适用于各种情况的开源事件流平台。 让我们回顾一下流行的 Kafka 用例。 …