android matrix 最全方法详解与进阶(完整篇),2024年最新kotlin数组性能

这里写图片描述

其实旋转,就是使用了这样的matrix,显而易见,这里的参数就清晰了。

sinValue:对应图中的sin值

cosValue:对应cos值

px:中心的x坐标

py:中心的y坐标

看一个示例,我们把图像旋转90度,那么90度对应的sin和cos分别是1和0。

这里写图片描述

看代码如下:

Matrixmatrix = new Matrix();

matrix.setSinCos(1, 0, bitmap.getWidth() / 2, bitmap.getHeight() / 2);

canvas.drawBitmap(bitmap, matrix, paint);

(9) setSkew

public void setSkew(float kx, float ky, float px, float py)

public void setSkew(float kx, float ky)

错切,这里kx,ky分别代表了x,y上的错切因子,px,py代表了错切的中心。

(10) setConcat

public boolean setConcat(Matrix a,Matrix b)

将当前matrix的值变为a和b的乘积,它的意义在下面的 进阶方法中来探讨。

4 进阶方法解析

上面的基本方法中,有关于变换的set方法都可以带来不同的效果,但是每个set都会把上个效果清除掉,例如依次调用了setSkew,setTranslate,那么最终只有setTranslate会起作用,那么如何才和将两种效果复合呢。Matrix给我们提供了很多方法。但是主要都是2类:

preXXXX:以pre开头,例如preTranslate

postXXXX:以post开头,例如postScale

他们分别代表了前乘,和后乘。看一段代码:

Matrix matrix = new Matrix();

matrix.setTranslate(100, 1000);

matrix.preScale(0.5f, 0.5f);

这里matrix前乘了一个scale矩阵,换算成数学式如下:

这里写图片描述

从上面可以看出,最终得出的matrix既包含了缩放信息也有平移信息。

后乘自然就是matrix在后面,而缩放矩阵在前面,由于矩阵前后乘并不等价,也就导致了他们的效果不同。我们来看看后乘的结果:

这里写图片描述

可以看到,结果跟上面不同,并且这也不是我们想要的结果,这里缩放没有更改,但是平移被减半了,换句话说,平移的距离也被缩放了。所以需要注意前后乘法的关系。

来看看他们对应的效果图:

前乘:

这里写图片描述

后乘:

这里写图片描述

可以明显看到,后乘的平移距离受了影响。

了解清除了前后乘的意义,在使用的过程中,多个效果的叠加时,一样要注意,否则效果达不到预期。

5 其他方法解析

matrix除了上面的方法外,还有一些其他的方法,这里依次解析

(1) setRectToRect

public boolean setRectToRect(RectF src, RectF dst, ScaleToFit stf)

将rect变换成rect,上面的rectStaysRect已经说过,要保持rect只能做缩放平移和选择90度的倍数,那么这里其实也是一样,只是这几种变化,这里通过stf参数来控制。

ScaleToFit 有如下四个值:

FILL: 可能会变换矩形的长宽比,保证变换和目标矩阵长宽一致。

START:保持坐标变换前矩形的长宽比,并最大限度的填充变换后的矩形。至少有一边和目标矩形重叠。左上对齐。

CENTER: 保持坐标变换前矩形的长宽比,并最大限度的填充变换后的矩形。至少有一边和目标矩形重叠。

END:保持坐标变换前矩形的长宽比,并最大限度的填充变换后的矩形。至少有一边和目标矩形重叠。右下对齐。

这里使用谷歌的api demo的图片作为例子:

这里写图片描述

(2) setPolyToPoly

public boolean setPolyToPoly(float[] src, int srcIndex,float[] dst, int dstIndex,int pointCount)

通过指定的0-4个点,原始坐标以及变化后的坐标,来得到一个变换矩阵。如果指定0个点则没有效果。

下面通过例子分别说明1到4个点的可以达到的效果:

这里写代码片##### 1个点,平移

只指定一个点,可以达到平移效果:

这里写图片描述

代码如下:

float[] src = {0, 0};

int DX = 300;

float[] dst = {0 + DX, 0 + DX};

matrix.setPolyToPoly(src, 0, dst, 0, 1);

canvas.drawBitmap(bitmap, matrix, paint);

2个点,旋转或者缩放

两个点,可以达到旋转效果或者缩放效果,缩放比较简单,这里我们来看旋转效果,一个点指定中心,一点指出旋转的效果

这里写图片描述

代码如下

int bw = bitmap.getWidth();

int bh = bitmap.getHeight();

float[] src = {bw / 2, bh / 2, bw, 0};

float[] dst = {bw / 2, bh / 2, bw / 2 + bh / 2, bh / 2 + bw / 2};

matrix.setPolyToPoly(src, 0, dst, 0, 2);

canvas.drawBitmap(bitmap, matrix, paint);

图片的中心点作为旋转的中心,前后不变,右上角变化到了下方,所以导致图片旋转了90度。

3个点,错切

使用3个点,可以产生错切效果,指定3个顶点,一个固定,另外两个移动。

看图:

这里写图片描述

代码如下:

Matrix matrix = new Matrix();

int bw = bitmap.getWidth();

int bh = bitmap.getHeight();

float[] src = {0,0, 0, bh,bw,bh};

float[] dst = {0, 0, 200, bh, bw + 200, bh};

matrix.setPolyToPoly(src, 0, dst, 0, 3);

canvas.drawBitmap(bitmap, matrix, paint);

4个点,透视

透视就是观察的角度变化了。导致投射到平面上的二维图像变化了。

我们看下面的例子,更容易理解:

这里写图片描述

图片看起来好像倾斜了,实现特别简单:

Matrix matrix = new Matrix();

int bw = bitmap.getWidth();

int bh = bitmap.getHeight();

float[] src = {0, 0, 0, bh, bw, bh, bw, 0};

int DX = 100;

float[] dst = {0 + DX, 0, 0, bh, bw, bh, bw - DX, 0};

matrix.setPolyToPoly(src, 0, dst, 0, 4);

canvas.drawBitmap(bitmap, matrix, paint);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)

最后笔者收集整理了一份Flutter高级入门进阶资料PDF

以下是资料目录和内容部分截图

里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

最后笔者收集整理了一份Flutter高级入门进阶资料PDF

以下是资料目录和内容部分截图

[外链图片转存中…(img-Ae6c5OWM-1712684458932)]

[外链图片转存中…(img-BT7DaotT-1712684458932)]

里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

[外链图片转存中…(img-BGi0AlIo-1712684458932)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[外链图片转存中…(img-K6FTQD0d-1712684458933)]