在进行坐标变换的时候,都绕不开Matrix类,那到底Matrix原理是什么以及怎么使用,接下来将会详细讲解。
通过这篇文章,你将了解到:
1、Matrix类的基本方法
2、pre/post该怎么理解
3、Matrix底层原理
4、Matrix实际运用
如上图,是一个二行二列的矩阵。
矩阵可以相加(相减),条件是两个矩阵的行数和列数需要一致(同型矩阵)。
矩阵可以相乘,条件是第一个矩阵列数和第二个矩阵的行数一致
举个简单的乘法的例子:
将乘数交换位置
可以看出,交换了位置之后,乘法的结果就不一样了。
实际上:矩阵乘法不满足交换律
单位矩阵:主对角线上都是1,其余位置为0的方阵称为单位矩阵
单位矩阵特点:任何矩阵与单位矩阵相乘结果为其本身
上面阐述了矩阵的一些基本知识,接下来分析Matrix的原理。
平时接触到的坐标系大部分是平面坐标(二维),对坐标系的变换包括平移、缩放、旋转、错切等。Android Canvas绘制的时候,默认绘制的起始点是(0,0),如何更改Canvas绘制位置呢?Android提供了Matrix类对Canvas坐标进行变换。
Matrix顾名思义:矩阵。
Android Matrix类操作的是一个3*3(3行/3列)矩阵。
那么Matrix矩阵里的值代表什么呢?
从上图可以看出,矩阵里的每个值都有其作用。若要对坐标进行缩放,则通过修改scaleX、scaleY的值,若要对坐标进行平移,则通过修改transX、transY的值,若要对坐标进行错切,则通过修改skewX、skewY值,pers0、pers1、pers2是关于透视的。
也许你已经注意到漏了一项,对坐标进行旋转,该修改哪个值呢?
如上图红色框内的4个值,当要对坐标进行旋转,则更改这4个值。
通过上述可以知:
Matrix类的作用:对点的坐标进行变换
关于这些值的数学原理,可搜索其它相关文章,此处暂时略过。
既然Matrix类是通过对矩阵操作来达到坐标变换的目的,那么其需要对外暴露操作矩阵的方法,我们在搜索一下该类中的方法:
方法很多,挑选出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绘制简单矩形,运行后:
蓝色矩形是先于setTranslate()方法绘制,红色是后于setTranslate()方法绘制。
相当于蓝色矩形里的每个点都在水平方向移动了300px。
matrix = new Matrix() ->构造矩阵,并且是3*3单位矩阵
setTranslate(300, 0)->修改新构造的矩阵TransX值,其它值为单位矩阵的默认值
用矩阵表示:
换做preTranslate方法呢?
matrix = new Matrix()->构造3*3单位矩阵,我们称为I
preTranslate()->称为“左乘”,将平移矩阵称为T,“左乘”的意思是将当前存在的矩阵I“乘”待变换的平移矩阵T,新矩阵的结果为:M=I * T
用矩阵表示:
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 举报,一经查实,本站将立刻删除。
扫码加微信详细咨询太和智慧养老产品和平台服务!
养老资讯
- 骁骑校尉是何职相当于现在
- CK 这个牌子的全名是什
- 39岁谢娜挺大孕肚罕亮相
- 好词佳句摘抄有哪些?关于
- “我欲与君相知,长命无绝
- 世界排名前十的男士香水品
- 形容水面的词语有哪些?“
- 无锡游乐场有哪些?无锡动
- 中国海军目前一共派出了多
- 100字优美的句子摘抄?
- 反其道而行之的意思是什么
- 《三国演义》的作者是谁?
- 我家有好几块和田玉想出手
- 五句优美句子简短?超短唯
- 蔡邕是个怎样的人呢?蔡邕
- 姹紫嫣红的近义词是啥?姹
- “且行且珍惜”是什么意思
- 关于居里夫人的名言?关于
- 求郭冬临主演的一部有关于
- 如何在PPT中绘制阶梯形
- 惊叹不已的解释词语是什么
- 十元纸币背后什么图片?人
- 天津有什么好玩的地方哪些
- “悠然见南山”的上一句?
- 你是什么星座的土味情话怎
- 万元鞋子被游客踩脏,杨幂
- 反其道而行之是什么意思?
- 有收邮票的吗?虎年生肖邮
- “红杏枝头春意闹”是什么
- 孟晚舟的可能结局是什么?
- 2寸证件照片尺寸是多少?
- 傅雷家书读书笔记摘抄及感
- 黄鹤楼送孟浩然之广陵的诗
- 中国国画大师排名?中国有
- 伊朗公布了几种新型导弹?
- 季春、仲夏、孟秋、季冬分
- 打肿脸充胖子的成语解释及
- 夜书所见诗意?叶绍翁的《
- 孙小头上六星开国纪念币真
- 高分一号卫星详细资料,高
助老机构介绍
姓名:
年龄:
电话: