登陆 | 注册 设为首页 | 加入收藏 | 联系我们
太和养老网
热词老年艺术  助老机构  养老系统  

中心区域北京 天津 河北 山西 内蒙古 辽宁 吉林 黑龙江 上海 江苏 浙江 安徽 福建 江西 山东 河南 湖北 湖南 广东 广西 海南 重庆 四川 贵州 云南 西藏 陕西 甘肃 青海 宁夏 新疆 香港 澳门 台湾 全国城市养老院目录 全国县市养老院汇总目录 太和AI作品展 太和养老艺术网AI作品展示

Android Matrix 不再疑惑-飞

 

2023/7/6 17:08:44 ('互联网')

前言

在进行坐标变换的时候,都绕不开Matrix类,那到底Matrix原理是什么以及怎么使用,接下来将会详细讲解。
通过这篇文章,你将了解到:

1、Matrix类的基本方法
2、pre/post该怎么理解
3、Matrix底层原理
4、Matrix实际运用

矩阵知识image.png

如上图,是一个二行二列的矩阵。
矩阵可以相加(相减),条件是两个矩阵的行数和列数需要一致(同型矩阵)。


image.png

矩阵可以相乘,条件是第一个矩阵列数和第二个矩阵的行数一致


image.png

举个简单的乘法的例子:


image.png

将乘数交换位置


image.png

可以看出,交换了位置之后,乘法的结果就不一样了。
实际上:矩阵乘法不满足交换律
单位矩阵:主对角线上都是1,其余位置为0的方阵称为单位矩阵
单位矩阵特点:任何矩阵与单位矩阵相乘结果为其本身

image.png

Matrix原理

上面阐述了矩阵的一些基本知识,接下来分析Matrix的原理。
平时接触到的坐标系大部分是平面坐标(二维),对坐标系的变换包括平移、缩放、旋转、错切等。Android Canvas绘制的时候,默认绘制的起始点是(0,0),如何更改Canvas绘制位置呢?Android提供了Matrix类对Canvas坐标进行变换。
Matrix顾名思义:矩阵。
Android Matrix类操作的是一个3*3(3行/3列)矩阵。
那么Matrix矩阵里的值代表什么呢?


image.pngimage.png

从上图可以看出,矩阵里的每个值都有其作用。若要对坐标进行缩放,则通过修改scaleX、scaleY的值,若要对坐标进行平移,则通过修改transX、transY的值,若要对坐标进行错切,则通过修改skewX、skewY值,pers0、pers1、pers2是关于透视的。
也许你已经注意到漏了一项,对坐标进行旋转,该修改哪个值呢?


image.png

如上图红色框内的4个值,当要对坐标进行旋转,则更改这4个值。
通过上述可以知:
Matrix类的作用:对点的坐标进行变换
关于这些值的数学原理,可搜索其它相关文章,此处暂时略过。

Matrix常用方法

既然Matrix类是通过对矩阵操作来达到坐标变换的目的,那么其需要对外暴露操作矩阵的方法,我们在搜索一下该类中的方法:


image.png

方法很多,挑选出translate、rotate、scale、skew方法

translate:平移setTranslate(float dx, float dy)//dx表示x轴方向移动距离,dy表示y轴方向移动距离preTranslate(float dx, float dy)postTranslate(float dx, float dy)rotate:旋转setRotate(float degrees)//degrees 旋转角度setRotate(float degrees, float px, float py)//px py 旋转的支点(轴心点)preRotate(float degrees)preRotate(float degrees, float px, float py)postRotate(float degrees)postRotate(float degrees, float px, float py)scale:缩放setScale(float sx, float sy)//sx、sy缩放倍数setScale(float sx, float sy, float px, float py)//px py 旋转的支点(轴心点)preScale(float sx, float sy)preScale(float sx, float sy, float px, float py)postScale(float sx, float sy)postScale(float sx, float sy, float px, float py)skew:错切setSkew(float kx, float ky)setSkew(float kx, float ky, float px, float py)preSkew(float kx, float ky)preSkew(float kx, float ky, float px, float py)postSkew(float kx, float ky)postSkew(float kx, float ky, float(劳动节的来历:1886年5月1日,在美国芝加哥工人们每天要劳动14至16个小时,有的甚至长达18个小时,但工资却很低。于是二十余万名工人为争取合法权益而举行大罢工。工人们提出的罢工口号,要求实行八小时工作制。经过艰苦的流血斗争,终于获得了胜利。) px, float py)//src 要缩放的源矩形//dst 缩放后填充的目标矩形//stf 填充的方式setRectToRect(RectF src, RectF dst, ScaleToFit stf)//矩形衔接setConcat(Matrix a, Matrix b)

这些方法怎么理解以及怎么用呢?来看例子:

    @Override    protected void onDraw(Canvas canvas) {        //这里为方便在此new 对象,实际使用过程中不推荐         // 原因:1、onDraw()主线程执行,new对象产生耗时。2、onDraw()可能多次调用,导致频繁gc        rect = new Rect(0,0,200, 200);        //绘制矩形        canvas.drawRect(rect, paint);        //构造matrix        matrix = new Matrix();        //水平方向平移300        matrix.setTranslate(300, 0);        //matrix.preTranslate(300, 0);        //matrix.postTranslate(300, 0);        //设置matrix        canvas.setMatrix(matrix);        //设置画笔颜色        paint.setColor(Color.RED);        //绘制矩形        canvas.drawRect(rect, paint);    }

自定义view绘制简单矩形,运行后:


image.png

蓝色矩形是先于setTranslate()方法绘制,红色是后于setTranslate()方法绘制。
相当于蓝色矩形里的每个点都在水平方向移动了300px。

matrix = new Matrix() ->构造矩阵,并且是3*3单位矩阵
setTranslate(300, 0)->修改新构造的矩阵TransX值,其它值为单位矩阵的默认值

用矩阵表示:


image.png

换做preTranslate方法呢?

matrix = new Matrix()->构造3*3单位矩阵,我们称为I
preTranslate()->称为“左乘”,将平移矩阵称为T,“左乘”的意思是将当前存在的矩阵I“乘”待变换的平移矩阵T,新矩阵的结果为:M=I * T

用矩阵表示:


image.png

postTranslate方法与preTranslate方法相反,称为“右乘”,“右乘”的意思是将待变换的平移矩阵T“乘”当前存在的矩阵I,新矩阵的结果为:M=T * I

也许你发现了,在上述的例子里,分别使用setTranslate、preTranslate、postTranslate,最终的效果是一致的,是否说明了这三个方法功能一样的。实际上并不是如此,还记得之前我们说的矩阵知识,“任何矩阵乘单位矩阵结果为其自身”。原本的矩阵是单位矩阵I,因此此种情况下,preTranslate和postTranslate效果一致。
接下来看另一个例子:

    @Override    protected void onDraw(Canvas canvas) {        //这里为方便在此new 对象,实际使用过程中不推荐        // 原因:1、onDraw()主线程执行,new对象产生耗时。2、onDraw()可能多次调用,导致频繁gc        rect = new Rect(0,0,200, 200);        //绘制矩形        canvas.drawRect(rect, paint);        //构造matrix        matrix = new Matrix()



扫码加微信详细咨询太和智慧养老产品和平台服务!

 

 





版权声明:

---------------------------------------------------------------


所有信息来源于互联网,本文的版权归原作者所有,不代表本网观点和立场。

本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 81480447@qq.com 举报,一经查实,本站将立刻删除。



扫码加微信详细咨询太和智慧养老产品和平台服务!

 

养老资讯
助老机构介绍
评论
已有 0 条评论

最新评论

推荐养老院

您希望养老院位于
  • 不限
  • 东城
  • 西城
  • 崇文
  • 宣武
  • 朝阳
  • 丰台
  • 石景山
  • 海淀
  • 门头沟
  • 房山
  • 通州
  • 顺义
  • 昌平
  • 大兴
  • 怀柔
  • 平谷
  • 延庆
  • 密云
您希望的价格范围
  • 不限
  • 500以下
  • 500-1000
  • 1000-2000
  • 2000-3000
  • 3000-5000
  • 5000以上
老人的情况是
  • 不限
  • 自理
  • 半自理
  • 全护理
  • 特护

姓名

年龄

电话

全国城市养老院



关于我们 | 联系方式 | 网站地图 | 友情链接

Copyright 2010-2022 京ICP备18035644号-3 北京太和 版权所有