Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android中的Matrix(矩阵)

Android中的Matrix(矩阵)

作者头像
全栈程序员站长
发布于 2022-09-06 07:51:17
发布于 2022-09-06 07:51:17
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

写在前面

看这篇笔记之前先看一下参考文章,这篇笔记没有系统的讲述矩阵和代码的东西,参考文章写的也有错误的地方,要辨证的看。

  1. 如何计算矩阵乘法
  2. android matrix 最全方法详解与进阶(完整篇)
  3. Android Matrix 最全方法详解与进阶
  4. 1-4 Canvas 对绘制的辅助 clipXXX() 和 Matrix

矩阵的乘法

比如有矩阵A和矩阵B,他们分别为:

可以看到A为2行3列的矩阵,B为3行2列的矩阵,矩阵乘法符合下面的规则:

  1. 只有A的列数和B的行数相等,A和B才可以做乘法
  2. A*B的结果C是2行2列的矩阵,行数等于A的行数,列数等于B的列数
  3. 结果矩阵C的第一行第一列数值为A的第一行和B的第一列中的数字分别相乘后再相加。其他行列结果依次类推
  4. 矩阵的乘法不满足交换律,即A*B != B*A
  5. 矩阵的乘法满足结合律M‘ = T*(M*R) = T*M*R = (T*M)*R

详细信息可以看这里:如何计算矩阵乘法

Android中常用的四种矩阵变换

Android中使用3×3的矩阵进行图形的变换,它看起来大概是下面这样:

在Android中,使用一个3×1的矩阵来表示一个点:

x,y分别代表x,y轴上的坐标,而1代表屏幕在z轴上的坐标为默认的。如果将1变大,那么屏幕会拉远, 图形会变小。

平移(Translate)

图例:

错切(Skew)

水平错切

图例:

垂直错切

图例:

复合错切

图例:

旋转(Rotate)

图例:

缩放(Scale)

图例:

Matrix的组合

应用矩阵进行图形变换的主要原因,是因为矩阵是可以通过矩阵的乘法进行组合使用的,如果想对canvas绘制的bitmap时,先平移T(dx, dy),再旋转R(θ),最后缩放S(k1,k2),就可以将三个变换矩阵相乘,M‘ = ABC,再对canvas应用M’矩阵即可。

Matrix的坐标系

矩阵的操作可以看作是以坐标原点为原点的坐标系在三维空间中做的变换,不同于canvas的屏幕坐标系坐标系,矩阵Matrix的坐标系为左手坐标系:

这个坐标系对应的每个轴的旋转方向(从原点看出去,每个轴的旋转方向都是逆时针):

Matrix的操作可以看做是对上面左手坐标系的变换

因为Matrix变换后是对每个canvas的点起作用,其实也可以看做对这个三维坐标系起了作用,canvas绘制的是三维坐标系上的图像对canvas二位坐标系的投影。

所以,可以用自己的左手模拟进行平移旋转等操作,更加直观的想象变换后的效果。

Matrix的左乘和右乘

在Android中,有关矩阵的操作都是成对的,比如preTranslate(float dx, float dy)和postTranslate(float dx, float dy),通过看api的介绍,如果原矩阵为M,那么pre表示的是左乘,post表示右乘:

preTranslate : M’ = M * T(dx, dy) // 左乘 postTranslate: M’ = T(dx, dy) * M // 右乘

因为矩阵的变换是顺序执行的,所以在平时最常用的应该是pre左乘,所有的变换操作都依次执行,比如canvas常用的translate等变换方法其实就是左乘。右乘其实就是在所有操作之前增加一步操作,合理的运用右乘可以方便代码的编写。

比如:图形变换是以左边原点为原点的,所以旋转、缩放等功能应用到canvas.drawBitmap()方法时(因为bitmap常从原点往右下方画),图像表现出来的结果就特别奇怪,需要将canvas的坐标系移动到图像的中心点再操作然后再把坐标系移回去,那么如果只用pre左乘的话,代码是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Matrix matrix = new Matrix();
matrix.preTranslate(pivotX,pivotY);
// 各种操作,旋转,缩放,错切等,可以执行多次。
matrix.preTranslate(-pivotX, -pivotY);

如果合理使用右乘,那么代码就成了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Matrix matrix = new Matrix();
// 各种操作,旋转,缩放,错切等,可以执行多次。
matrix.postTranslate(pivotX,pivotY);
matrix.preTranslate(-pivotX, -pivotY);

减少了postTranslate和preTranslate之间的距离。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155028.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浏览器页面渲染全解析过程优化及实战指南详解
将HTML、CSS和JavaScript转换为屏幕上的像素,实现用户可交互的视觉界面。
用户2102001
2025/05/22
1800
浏览器页面渲染全解析过程优化及实战指南详解
简单说 通过JS控制CSS的各种方式(上)
版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。 https://blog.csdn.net/FE_dev/article/details/77888446
FEWY
2019/05/26
4.9K1
【JavaScript】JavaScript开篇基础(4)
常用的事件: 鼠标事件: onclick(鼠标点击) onmouseover(鼠标经过), onmouseout(鼠标离开), onfocus(获得鼠标焦点), onblur(失去鼠标焦点), onmousemove(鼠标移动触发), onmouseup(鼠标弹起触发), onmousedown(鼠标按下触发) 事件的组成: 事件源:事件触发的对象,如 按钮 事件类型:如何触发,什么事件,如 鼠标点击(onclick) 事件处理程序: 通过一个函数赋值的方式完成
E绵绵
2024/11/05
1400
【JavaScript】JavaScript开篇基础(4)
面试题 | 获取元素的最终background-color
一、题目 用JS代码求出页面上一个元素的最终的background-color,不考虑IE浏览器,不考虑元素float情况。(这道题copy自网上) 二、题目解析 1.考察底层JavaScript基础 前端开发,日常最常接触的就是页面样式的编写。而摆脱jQuery等工具库,用原生js获取样式,是每个前端程序猿进阶阶段必须掌握的技能。 2.考察面试者的思维缜密程度和开发经验 如果认为单单求元素计算后的样式,就有点too young了。页面的样式的复杂,永远是最虐心的。就算前端有多牛逼,一听到兼容IE6,论谁都
用户1097444
2022/06/29
4690
面试题 | 获取元素的最终background-color
一道微信前端面试题解析
一、题目 用JS代码求出页面上一个元素的最终的background-color,不考虑IE浏览器,不考虑元素float情况。(这道题copy自网上) 二、题目解析 2.1 考察底层JavaScript基础 前端开发,日常最常接触的就是页面样式的编写。而摆脱jQuery等工具库,用原生js获取样式,是每个前端程序猿进阶阶段必须掌握的技能。 2.2 考察面试者的思维缜密程度和开发经验 如果认为单单求元素计算后的样式,就有点too young了。页面的样式的复杂,永远是最虐心的。就算前端有多牛逼,一听到兼容IE
用户1097444
2022/06/29
4500
一道微信前端面试题解析
分享一些有趣的前端图形和页面
可以看到边框是由上下左右4个部分组成的,如果将div1的宽高设置为0,就变成如下效果:
雨临Lewis
2022/01/12
7520
分享一些有趣的前端图形和页面
【Web APIs】JavaScript 操作元素 ⑤ ( 修改元素样式属性 | 行内样式操作 - element.style | 类名样式操作 | 类列表样式操作 )
在 【Web APIs】JavaScript 操作元素 ① ( 修改元素内容 | innerText 属性修改元素文本内容 | innerHTML 属性修改元素 HTML 内容 ) 博客中介绍了 使用
韩曙亮
2024/08/09
2770
【Web APIs】JavaScript 操作元素 ⑤ ( 修改元素样式属性 | 行内样式操作 - element.style | 类名样式操作 | 类列表样式操作 )
前端开发,关键技术点杂烩
缓存:ETag Expire Last-Modified 三者合用,Expire 可以让浏览器完全不发起 Http 请求,若 F5 发起请求,也可以通过判断 ETag(对应浏览器字段 If-None-Match) 和 Last-Modified (对应浏览器字段 If-Modified-Since)字段是否需要更新资源还是使用 304(Not Modified) 的本地资源;
用户5997198
2019/08/09
1.2K0
WEB前端入门 学习记录
更多html实体参考手册:HTML ISO-8859-1 参考手册 来源:W3SCHOOL
用户6948990
2025/04/03
860
WEB前端入门 学习记录
HTML+CSS 面试题整理(一)
1.web标准: (1)结构标准:其语言主要包括XHTML(实现HTML向XML的过渡。)和XML(用于弥补HTML的不足) (2)表现标准:其语言主要包括CSS(帮助设计师分离外观与结构) (3)行为标准:其语言主要包括W3C Dom(提供标准方法用于访问站点中的数据、脚本和表现层对象)和ECMAScript (4)代码标准: ①必须结束标记:XHTML必须,HTML不一定 ②小写元素和属性名:XHTML对大小写敏感,HTML不敏感 ③比较必须合理嵌套 ④属性必须用“”括起来:XHTML必须,HTML
用户1667431
2018/04/18
1.1K0
HTML+CSS 面试题整理(一)
Web前端进阶高薪必会的54个CSS重难点知识梳理(1)
本次我把CSS中的重难点整理出来,总共54个核心知识点,供大家复习,希望能帮到大家。这些重难点是进阶高薪必需要掌握的知识点,同时也是面试必问的内容。
艾编程
2022/12/05
1.9K0
Web前端进阶高薪必会的54个CSS重难点知识梳理(1)
dom-to-image库是如何将html转换成图片的
dom-to-image库可以帮你把dom节点转换为图片,它的核心原理很简单,就是利用svg的foreignObject标签能嵌入html的特性,然后通过img标签加载svg,最后再通过canvas绘制img实现导出,好了,本文到此结束。
街角小林
2024/02/12
1.6K0
dom-to-image库是如何将html转换成图片的
像素是怎样练成的
本来呢,最近在规划一篇关于浏览器的文章,但是在做文章架构梳理和相关资料查询的时候,发现「浏览器在渲染页面」的过程中,也别有洞天。索性,就单独将其作为一篇文章来写。
前端柒八九
2023/08/01
4740
像素是怎样练成的
为WordPress适配暗黑模式 &集成到主题设置&整合方案
之前就有想法给主题适配一个暗黑模式,但就于目前大家的暗黑模式体验都不是很好。就一直被搁浅了。今天给新站移植RIPRO的时候,发现暗黑主题还蛮好玩的,开搞!
AlexTao
2020/02/17
2.6K0
css初始[通俗易懂]
h1 {color:red; font - size: 14px ;}
全栈程序员站长
2022/07/21
8380
css初始[通俗易懂]
CSS总结
  1.继承:子元素继承父元素的某些样式(因为有些元素有默认值,所以它们就不用继承父元素的)。
阿豪聊干货
2018/08/09
2.3K0
css多浏览常见问题
关于CSS对各个浏览器兼容已经是老生常谈的问题了, 网络上的教程遍地都是. 以下内容没有太多新颖, 纯属个人总结, 希望能对初学者有一定的帮助. 一、CSS HACK 以下两种方法几乎能解决现今所有HACK. 1, !important 随着IE7对!important的支持, !important 方法现在只针对IE6的HACK. (注意写法.记得该声明位置需要提前.) <style> #wrapper { width: 100px!important; /* IE7+FF */ wid
用户1112962
2018/07/03
1.2K0
104道 CSS 面试题,助你查漏补缺(上)
https://github.com/CavsZhouyou/Front-End-Interview-Notebook/blob/master/Css/Css.md
刘小夕
2020/11/03
2.3K0
104道 CSS 面试题,助你查漏补缺(上)
全栈之前端 | 1.CSS3必备基础知识学习
简述: HTML 标签原本被设计为用于定义文档内容, 通过使用 <h1>、<p>、<table>这样的标签,HTML 的初衷是表达“这是标题”、“这是段落”、“这是表格”之类的信息, 同时文档布局由浏览器来完成,而不使用任何的格式化标签。
全栈工程师修炼指南
2023/10/31
3270
全栈之前端 | 1.CSS3必备基础知识学习
IT课程 CSS基础 019_HelloCSS
CSS(Cascading Style Sheets,层叠样式表)和 HTML 类似,CSS 也不是真正的编程语言,甚至不是标记语言。CSS 是一门样式表语言,用于为 HTML 元素添加样式,描述 HTML 文档外观,控制 HTML 文档元素的颜色、大小、字体、布局等。
zhaoJian.Net
2024/04/03
1530
IT课程 CSS基础 019_HelloCSS
推荐阅读
相关推荐
浏览器页面渲染全解析过程优化及实战指南详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验