android通过atrix得要宽高角度xyandroidmatrix详解gjnet的技术博客

这应该是目前最详细的一篇讲解Matrix的中文文章了,在上一篇文章Matrix原理中,我们对Matrix做了一个简单的了解,偏向理论,在本文中则会详细的讲解Matrix的具体用法,以及与Matrix相关的一些实用技巧。

按照惯例,先放方法表做概览。

方法类别

摘要

基本方法

equals hashCode toString toShortString

比较、 获取哈希值、 转换为字符串

数值操作

set reset setValues getValues

设置、 重置、 设置数值、 获取数值

数值计算

mapPoints mapRadius mapRect mapVectors

计算变换后的数值

设置(set)

setConcat setRotate setScale setSkew setTranslate

设置变换

前乘(pre)

preConcat preRotate preScale preSkew preTranslate

前乘变换

后乘(post)

postConcat postRotate postScale postSkew postTranslate

后乘变换

特殊方法

setPolyToPoly setRectToRect rectStaysRect setSinCos

一些特殊操作

invert isAffine(API21) isIdentity

求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 …

构造方法没有在上面表格中列出。

创建一个全新的Matrix,使用格式如下:

通过这种方式创建出来的并不是一个数值全部为空的矩阵,而是一个单位矩阵,如下:

这种方法则需要一个已经存在的矩阵作为参数,使用格式如下:

创建一个Matrix,并对src深拷贝(理解为新的matrix和src是两个对象,但内部数值相同即可)。

基本方法内容比较简单,在此处简要介绍一下。

比较两个Matrix的数值是否相同。

获取Matrix的哈希值。

将Matrix转换为字符串: Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}

将Matrix转换为短字符串: [1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]

数值操作这一组方法可以帮助我们直接控制Matrix里面的数值。

没有返回值,有一个参数,作用是将参数Matrix的数值复制到当前Matrix中。如果参数为空,则重置当前Matrix,相当于reset()。

重置当前Matrix(将当前Matrix重置为单位矩阵)。

setValues的参数是浮点型的一维数组,长度需要大于9,拷贝数组中的前9位数值赋值给当前Matrix。

很显然,getValues和setValues是一对方法,参数也是浮点型的一维数组,长度需要大于9,将Matrix中的数值拷贝进参数的前9位中。

计算一组点基于当前Matrix变换后的位置,(由于是计算点,所以参数中的float数组长度一般都是偶数的,若为奇数,则最后一个数值不参与计算)。

它有三个重载方法:

(1) void mapPoints (float[] pts)

示例:

结果:

(2) void mapPoints (float[] dst, float[] src)

如果原始数据需要保留则一般使用这种方法。

示例:

结果:

(3) void mapPoints (float[] dst, int dstIndex,float[] src, int srcIndex, int pointCount)

参数

摘要

dst

目标数据

dstIndex

目标数据存储位置起始下标

src

源数据

srcIndex

源数据存储位置起始下标

pointCount

计算的点个数

示例:

将第二、三个点计算后存储进dst最开始位置。

结果:

测量半径,由于圆可能会因为画布变换变成椭圆,所以此处测量的是平均半径。

示例:

结果:

测量矩形变换后位置。

(1) boolean mapRect (RectF rect)

示例:

结果:

由于使用了错切,所以返回结果为false。

(2) boolean mapRect (RectF dst, RectF src)

测量向量。

mapVectors 与 mapPoints 基本上是相同的,可以直接参照上面的mapPoints使用方法。而两者唯一的区别就是mapVectors不会受到位移的影响,这符合向量的定律,如果你不了解的话,请找到以前教过你的老师然后把学费要回来。

区别:

结果:

对于四种基本变换 平移(translate)、缩放(scale)、旋转(rotate)、 错切(skew) 它们每一种都三种操作方法,分别为 设置(set)、 前乘(pre) 和 后乘 (post)。而它们的基础是Concat,通过先构造出特殊矩阵然后用原始矩阵Concat特殊矩阵,达到变换的结果。

方法

简介

set

设置,会覆盖掉之前的数值,导致之前的操作失效。

pre

前乘,相当于矩阵的右乘, M' = M * S

post

后乘,相当于矩阵的左乘,M' = S * M

这个可以用于判定View在屏幕上的绝对位置,View可以根据所处位置做出调整。

使用时需要注意构造顺序。

这一类方法看似不起眼,但拿来稍微加工一下就可能制作意想不到的效果。

Poly全称是Polygon,多边形的意思,了解了意思大致就能知道这个方法是做什么用的了,应该与PS中自由变换中的扭曲有点类似。

从参数我们可以了解到setPolyToPoly最多可以支持4个点,这四个点通常为图形的四个角,可以通过这四个角将视图从矩形变换成其他形状。

简单示例:

我们知道pointCount支持点的个数为0到4个,四个一般指图形的四个角,属于最常用的一种情形,但前面几种是什么情况呢?

发布此文的时候之所以没有讲解0到3的情况,是因为前面的几种情况在实际开发中很少会出现, 才不是因为偷懒呢,哼。

pointCount

摘要

相当于reset

相当于translate

可以进行 缩放、旋转、平移 变换

可以进行 缩放、旋转、平移、错切 变换

可以进行 缩放、旋转、平移、错切以及任何形变

从上表我们可以观察出一个规律, 随着pointCount数值增大setPolyToPoly的可以操作性也越来越强,这不是废话么,可调整点数多了能干的事情自然也多了。

只列一个表格就算交代完毕了显得诚意不足,为了彰显诚意,接下来详细的讲解一下。

为什么说前面几种情况在实际开发中很少出现?

作为开发人员,写出来的代码出了要让机器”看懂”,没有歧义之外,最重要的还是让人看懂,以方便后期的维护修改,从上边的表格中可以看出,前面的几种种情况都可以有更直观的替代方法,只有四个参数的情况下的特殊形变是没有替代方法的。

测控点选取位置?

测控点可以选择任何你认为方便的位置,只要src与dst一一对应即可。不过为了方便,通常会选择一些特殊的点: 图形的四个角,边线的中心点以及图形的中心点等。不过有一点需要注意,测控点选取都应当是不重复的(src与dst均是如此),如果选取了重复的点会直接导致测量失效,这也意味着,你不允许将一个方形(四个点)映射为三角形(四个点,但其中两个位置重叠),但可以接近于三角形。。

作用范围?

作用范围当然是设置了Matrix的全部区域,如果你将这个Matrix赋值给了Canvas,它的作用范围就是整个画布,如果你赋值给了Bitmap,它的作用范围就是整张图片。

接下来用示例演示一下,所有示例的src均为图片大小,dst根据手势变化。

pointCount为0

pointCount为0和reset是等价的,而不是保持matrix不变,在最底层的实现中可以看到这样的代码:

pointCount为1

pointCount为0和translate是等价的,在最底层的实现中可以看到这样的代码:

平移的距离是dst - src.

当测控点为1的时候,由于你只有一个点可以控制,所以你只能拖拽着它在2D平面上滑动。

pointCount为2

当pointCount为2的时候,可以做缩放、平移和旋转。

pointCount为3

当pointCount为3的时候,可以做缩放、平移、旋转和错切。

pointCount为4

当pointCount为4的时候,你可以将图像拉伸为任意四边形。

上面已经用图例比较详细的展示了不同操控点个数的情况,如果你依旧存在疑问,可以获取代码自己试一下。

简单来说就是将源矩形的内容填充到目标矩形中,然而在大多数的情况下,源矩形和目标矩形的长宽比是不一致的,到底该如何填充呢,这个填充的模式就由第三个参数 stf

ScaleToFit 是一个枚举类型,共包含了四种模式:

模式

摘要

CENTER

居中,对src等比例缩放,将其居中放置在dst中。

START

顶部,对src等比例缩放,将其放置在dst的左上角。

END

底部,对src等比例缩放,将其放置在dst的右下角。

FILL

充满,拉伸src的宽和高,使其完全填充满dst。

下面我们看一下不同宽高比的src与dst在不同模式下是怎样的。

假设灰色部分是dst,橙色部分是src,由于是测试不同宽高比,示例中让dst保持不变,看两种宽高比的src在不同模式下填充的位置。

src(原始状态)

CENTER

START

END

FILL

下面用代码演示一下居中的示例:

判断矩形经过变换后是否仍为矩形,假如Matrix进行了平移、缩放则画布仅仅是位置和大小改变,矩形变换后仍然为矩形,但Matrix进行了非90度倍数的旋转或者错切,则矩形变换后就不再是矩形了,这个很好理解,不过多赘述,顺便说一下,前面的mapRect方法的返回值就是根据rectStaysRect来判断的。

设置sinCos值,这个是控制Matrix旋转的,由于Matrix已经封装好了Rotate方法,所以这个并不常用,在此仅作概述。

简单测试:

结果:

方法

摘要

invert

求矩阵的逆矩阵

isAffine

判断当前矩阵是否为仿射矩阵,API21(5.0)才添加的方法。

isIdentity

判断当前矩阵是否为单位矩阵。

求矩阵的逆矩阵,简而言之就是计算与之前相反的矩阵,如果之前是平移200px,则求的矩阵为反向平移200px,如果之前是缩小到0.5f,则结果是放大到2倍。

简单测试:

结果:

判断矩阵是否是仿射矩阵, 貌似并没有太大卵用,因为你无论如何操作结果始终都为true。

这是为什么呢?因为迄今为止我们使用的所有变换都是仿射变换,那变换出来的矩阵自然是仿射矩阵喽。

判断是否是仿射矩阵最重要的一点就是,直线是否仍为直线,简单想一下就知道,不论平移,旋转,错切,缩放,直线变换后最终仍为直线,要想让isAffine的结果变为false,除非你能把直线掰弯,我目前还没有找到能够掰弯的方法,所以我仍是直男(就算找到了,我依旧是直男)。

简单测试:

结果:

新创建的Matrix和重置后的Matrix都是单位矩阵,不过,只要随意操作一步,就不在是单位矩阵了。

简单测试:

结果:

通过前面的代码和示例,我们已经了解了Matrix大部分方法是如何使用的,这些基本的原理和方法通过组合可能会创造出神奇的东西,网上有很多教程讲Bitmap利用Matrix变换来制作镜像倒影等,这都属于Matrix的基本应用,我就不在赘述了,下面我简要介绍几种然并卵的小技巧,更多的大家可以开启自己的脑洞来发挥。

在之前的文章Matrix原理中我们提到过Matrix最根本的作用就是坐标映射,将View的相对坐标映射为屏幕的绝对坐标,也提到过我们在onDraw函数的canvas中获取到到Matrix并不是单位矩阵,结合这两点,聪明的你肯定想到了我们可以从canvas的Matrix入手取得View在屏幕上的绝对位置。

不过,这也仅仅是一个然并卵的小技巧而已,使用getLocationOnScreen同样可以获取View在屏幕的位置,但如果你是想让下一任接盘侠弄不明白你在做什么或者是被同事打死的话,尽管这么做。

简单示例:

结果:

这个全凭大家想象力啦,不过我搜了一下还真搜到了好东西,之前鸿洋大大发过一篇博文详细讲解了利用setPolyToPoly制造的折叠效果布局,大家直接到他的博客去看吧,我就不写了。

图片引用自鸿洋大大的博客,稍作了一下处理。

博文链接:

Android FoldingLayout 折叠布局 原理及实现(一)

Android FoldingLayout 折叠布局 原理及实现(二)

作者微博: GcsSloop

本文内容偏向理论,和 画布操作 有重叠的部分,本文会让你更加深入的了解其中的原理。

本篇的主角Matrix,是一个一直在后台默默工作的劳动模范,虽然我们所有看到View背后都有着Matrix的功劳,但我们却很少见到它,本篇我们就看看它是何方神圣吧。

由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧。

Matrix是一个矩阵,主要功能是坐标映射,数值转换。

它看起来大概是下面这样:

Matrix作用就是坐标映射,那么为什么需要Matrix呢? 举一个简单的例子:

我的的手机屏幕作为物理设备,其物理坐标系是从左上角开始的,但我们在开发的时候通常不会使用这一坐标系,而是使用内容区的坐标系。

以下图为例,我们的内容区和屏幕坐标系还相差一个通知栏加一个标题栏的距离,所以两者是不重合的,我们在内容区的坐标系中的内容最终绘制的时候肯定要转换为实际的物理坐标系来绘制,Matrix在此处的作用就是转换这些数值。

假设通知栏高度为20像素,导航栏高度为40像素,那么我们在内容区的(0,0)位置绘制一个点,最终就要转化为在实际坐标系中的(0,60)位置绘制一个点。

以上是仅作为一个简单的示例,实际上不论2D还是3D,我们要将图形显示在屏幕上,都离不开Matrix,所以说Matrix是一个在背后辛勤工作的劳模。

1.认为Matrix最下面的一行的三个参数(MPERSP_0、MPERSP_1、MPERSP_2)没有什么太大的作用,在这里只是为了凑数。

实际上最后一行参数在3D变换中有着至关重要的作用,这一点会在后面中Camera一文中详细介绍。

2.最后一个参数MPERSP_2被解释为scale

的确,更改MPERSP_2的值能够达到类似缩放的效果,但这是因为齐次坐标的缘故,并非这个参数的实际功能。

Matrix 是一个矩阵,最根本的作用就是坐标转换,下面我们就看看几种常见变换的原理:

我们所用到的变换均属于仿射变换,仿射变换是 线性变换(缩放,旋转,错切) 和 平移变换(平移) 的复合,由于这些概念对于我们作用并不大,此处不过多介绍,有兴趣可自行了解。

基本变换有4种: 平移(translate)、缩放(scale)、旋转(rotate) 和 错切(skew)。

下面我们看一下四种变换都是由哪些参数控制的。

由于我们以下大部分的计算都是基于矩阵乘法规则,如果你已经把线性代数还给了老师,请参考一下这里: 维基百科-矩阵乘法

用矩阵表示:

你可能注意到了,我们坐标多了一个1,这是使用了齐次坐标系的缘故,在数学中我们的点和向量都是这样表示的(x, y),两者看起来一样,计算机无法区分,为此让计算机也可以区分它们,增加了一个标志位,增加之后看起来是这样:

(x, y, 1) - 点(x, y, 0) - 向量

另外,齐次坐标具有等比的性质,(2,3,1)、(4,6,2)…(2N,3N,N)表示的均是(2,3)这一个点。(将MPERSP_2解释为scale这一误解就源于此)。

图例:

错切存在两种特殊错切,水平错切(平行X轴)和垂直错切(平行Y轴)。

用矩阵表示:

图例:

用矩阵表示:

图例:

水平错切和垂直错切的复合。

用矩阵表示:

图例:

假定一个点 A(x0, y0) ,距离原点距离为 r, 与水平轴夹角为 α 度, 绕原点旋转 θ 度, 旋转后为点 B(x, y) 如下:

用矩阵表示:

图例:

此处也是使用齐次坐标的优点体现之一,实际上前面的三个操作使用 2x2 的矩阵也能满足需求,但是使用 2x2 的矩阵,无法将平移操作加入其中,而将坐标扩展为齐次坐标后,将矩阵扩展为 3x3 就可以将算法统一,四种算法均可以使用矩阵乘法完成。

用矩阵表示:

图例:

其实Matrix的多种复合操作都是使用矩阵乘法实现的,从原理上理解很简单,但是,使用矩阵乘法也有其弱点,后面的操作可能会影响到前面到操作,所以在构造Matrix时顺序很重要。

我们常用的四大变换操作,每一种操作在Matrix均有三类,前乘(pre),后乘(post)和设置(set),可以参见文末对Matrix方法表,由于矩阵乘法不满足交换律,所以前乘(pre),后乘(post)和设置(set)的区别还是很大的。

前乘相当于矩阵的右乘:

这表示一个矩阵与一个特殊矩阵前乘后构造出结果矩阵。

前乘相当于矩阵的左乘:

这表示一个矩阵与一个特殊矩阵后乘后构造出结果矩阵。

设置使用的不是矩阵乘法,而是直接覆盖掉原来的数值,所以,使用设置可能会导致之前的操作失效。

首先澄清两个错误结论,记住,是错误结论,错误结论,错误结论。

这个结论很具有迷惑性,因为这个结论并非是完全错误的,你很容易就能证明这个结论,例如下面这样:

这两段代码最终结果是等价的,于是轻松证得这个结论的正确性,但事实真是这样么?

首先,从数学角度分析,pre 和 post 就是右乘或者左乘的区别,其次,它们不可能实际影响运算顺序(程序执行顺序)。以上这两段代码等价也仅仅是因为最终化简公式一样而已。

设原始矩阵为 M,平移为 T ,旋转为 R ,单位矩阵为 I ,最终结果为 M’

由于两者最终的化简公式是相同的,所以两者是等价的,但是,这结论不具备普适性。

即原始矩阵不为单位矩阵的时候,两者无法化简为相同的公式,结果自然也会不同。另外,执行顺序就是程序书写顺序,不存在所谓的正序逆序。

这一条结论比上一条更离谱。

所以就得出了 pre 先执行,而 post 后执行这一说法,但从严谨的数学和程序角度来分析,完全是不可能的,还是上面所说的,pre 和 post 不能影响程序执行顺序,而程序每执行一条语句都会得出一个确定的结果,所以,它根本不能控制先后执行,属于完全扯淡型。

如果非要用这套理论强行解释的话,反而看起来像是 post 先执行,例如:

同样化简公式:

从实际上来说,由于矩阵乘法满足结合律,所以不论你说是靠右先执行还是靠左先执行,从结果上来说都没有错。

之前基于这条错误的结论我进行了一次错误的证明:

(这段内容注定要成为我写作历程中不可抹灭的耻辱,既然是公开文章,就应该对读者负责,虽然我在发表每一篇文章之前都竭力的求证其中的问题,各种细节,避免出现这种错误,但终究还是留下了这样一段内容,在此我诚挚的向我所有的读者道歉。)

关注我的读者请尽量看我在 个人博客 和 GitHub 发布的版本,这两个平台都在博文修复计划之内,有任何错误或者纰漏,都会首先修复这两个平台的文章。另外,所有进行修复过的文章都会在我的微博 @GcsSloop 重新发布说明,关注我的微博可以第一时间得到博文更新或者修复的消息。

在实际操作中,我们每一步操作都会得出准确的计算结果,但是为什么还会用存在先后的说法? 难道真的能够用pre和post影响计算顺序? 实则不然,下面我们用一个例子说明:

在上面的操作中,如果按照正常的思路,先缩放,后平移,缩放操作执行在前,不会影响到后续的平移操作,但是执行结果却发现平移距离变成了(500, 800)。

在上面例子中,计算顺序是没有问题的,先计算的缩放,然后计算的平移,而缩放影响到平移则是因为前一步缩放后的结果矩阵右乘了平移矩阵,这是符合矩阵乘法的运算规律的,也就是说缩放操作虽然在前却影响到了平移操作,相当于先执行了平移操作,然后执行的缩放操作,因此才有pre操作会先执行,而post操作会后执行这一说法。

上面的论证是完全错误的,因为可以轻松举出反例:

反例中,虽然将 postScale 改为了 preScale

他们结果相同是因为最终化简公式是相同的,都是 S*T

之所以平移距离是 MTRANS_X = 500,MTRANS_Y = 800,那是因为执行 Translate 之前 Matrix 已经具有了一个缩放比例。在右乘的时候影响到了具体的数值计算,可以用矩阵乘法计算一下。

最终结果为:

当 T*S 的时候,缩放比例则不会影响到 MTRANS_X 和 MTRANS_Y ,具体可以使用矩阵乘法自己计算一遍。

不要去管什么先后论,顺序论,就按照最基本的矩阵乘法理解。

那么如何使用?

正确使用方式就是先构造正常的 Matrix 乘法顺序,之后根据情况使用 pre 和 post 来把这个顺序实现。

还是用一个最简单的例子理解,假设需要围绕某一点旋转。

可以用这个方法 xxxRotate(angle, pivotX, pivotY)

首先,有两条基本定理:

基于这两条基本定理,我们可以推算出要基于某一个点进行旋转需要如下步骤:

具体公式如下:

M 为原始矩阵,是一个单位矩阵, M‘ 为结果矩阵, T 为平移, R为旋转

按照公式写出来的伪代码如下:

围绕某一点操作可以拓展为通用情况,即:

公式为:

但是这种方式,两个调整中心的平移函数就拉的太开了,所以通常采用这种写法:

这样公式为:

可以看到最终化简结果是相同的。

所以说,pre 和 post 就是用来调整乘法顺序的,正常情况下应当正向进行构建出乘法顺序公式,之后根据实际情况调整书写即可。

在构造 Matrix 时,个人建议尽量使用一种乘法,前乘或者后乘,这样操作顺序容易确定,出现问题也比较容易排查。当然,由于矩阵乘法不满足交换律,前乘和后乘的结果是不同的,使用时应结合具体情景分析使用。

注意:

用矩阵表示:

用矩阵表示:

或:

由于此处只有两步操作,且指定了先后,所以代码上交换并不会影响结果。

用矩阵表示:

注意: 由于矩阵乘法不满足交换律,请保证初始矩阵为单位矩阵,如果初始矩阵不为单位矩阵,则导致运算结果不同。

上面虽然用了很多不同的写法,但最终的化简公式是一样的,这些不同的写法,都是根据同一个公式反向推算出来的。

方法类别

摘要

基本方法

equals hashCode toString toShortString

比较、 获取哈希值、 转换为字符串

数值操作

set reset setValues getValues

设置、 重置、 设置数值、 获取数值

数值计算

mapPoints mapRadius mapRect mapVectors

计算变换后的数值

设置(set)

setConcat setRotate setScale setSkew setTranslate

设置变换

前乘(pre)

preConcat preRotate preScale preSkew preTranslate

前乘变换

后乘(post)

postConcat postRotate postScale postSkew postTranslate

后乘变换

特殊方法

setPolyToPoly setRectToRect rectStaysRect setSinCos

一些特殊操作

invert isAffine isIdentity

求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 …

对于Matrix重在理解,理解了其中的原理之后用起来将会更加得心应手。

学习目标:理解旋转矩阵的定义和几何意义,掌握其如何精确描述一个坐标系相对于另一个坐标系的姿态(旋转关系)。熟练掌握旋转矩阵的性质(正交性、行列式=1)。学会计算基本旋转(绕单一轴旋转)的旋转矩阵。理解旋转矩阵的两种核心作用:旋转向量 & 坐标系变换。掌握旋转矩阵的逆与转置的关系。核心概念解析:为什么需要旋转矩阵?回顾:昨天我们知道描述坐标系{B}相对于{A}需要位置向量 ^A P_{Bor

经典好文推荐,通过阅读本文,您将收获以下知识点:一、 获取手机基本信息(厂商、型号等参数)二、设备信息获取实现图三、 获取手机设备 宽、高、IMEI 信息四、 获取手机厂商名、产品名、手机品牌、手机型号、主板名、设备名五、获取手机硬件名、SDK版本、android版本 、语言支持、默认语言六、 获取 SD 卡存储信息七、 获取手机 RAM、ROM存储信息八、DeviceInfoUtils 封装类九

dumpsys 是 Android 操作系统中的一个命令行工具,用于获取系统服务的状态信息和调试数据。它允许开发者、系统管理员或高级用户从 Android 系统中提取各种有用的运行时信息,比如电池状态、内存使用情况、活动服务、硬件信息、应用的状态等。dumpsys 是一个强大的工具,它可以输出 Android 系统各个子系统的状态,并且在开发和调试应用时非常有用。以下是对 dumpsys 的详

在开发 Android 应用时,经常会遇到“android imageView Matrix 宽高不起作用”的问题。这是一种比较棘手的状况,让人困惑不已,尤其是当你需要在 ImageView 控件中显示缩放和旋转变换时。本文将详细探讨这个问题,分析可能的原因和解决方案。### 适用场景分析在许多场景中,ImageView 的矩阵变换是非常重要的。例如,当我需要在应用程序中展示图片时,常常需

Matrix学习——基础知识 以前在线性代数中学习了矩阵,对矩阵的基本运算有一些了解,前段时间在使用GDI+的时候再次学习如何使用矩阵来变化图像,看了之后在这里总结说明。 首先大家看看下面这个3 x 3的矩阵,这个矩阵被分割成4部分。为什么分割成4部分,在后面详细说明。 首先给大家举个简单的例子:现设点P0(x0, y0)进行平移后,移到P(x,y),其中x方向的平移量为△x,y方向的平

在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。这些效果在android中有很好的支持,通过颜色矩阵(ColorMatrix)和坐标变换矩阵(Matrix)可以完美的做出上面的所说的效果。下面将分别介绍这两个矩阵的用法和相关的函数。颜色矩阵android中可以通过颜色矩阵(ColorMatrix类)方面的操作颜色,颜色矩阵是

# Android Matrix 镜像在Android开发中,Matrix是一个非常重要的类,它用来描述二维坐标变换和绘制操作。在Matrix类中,有一个非常常用的方法叫做`postScale(float sx, float sy)`,它可以实现对一个矩阵进行缩放操作。但是在某些情况下,我们可能需要对一个矩阵进行镜像操作,即在水平或者垂直方向上对矩阵进行翻转。本文将会详细介绍如何在Androi

# 实现Android Bitmap Matrix教程## 1. 整体流程```mermaidflowchart TD A(了解Bitmap和Matrix) --> B(创建Bitmap对象) B --> C(创建Matrix对象) C --> D(将Bitmap和Matrix关联) D --> E(对Bitmap进行变换操作)```## 2. 具体

# Android Matrix postTranslate实现方法## 简介在Android开发中,Matrix是一个2D转换矩阵,用于实现图像的平移、缩放、旋转和倾斜等操作。其中,postTranslate方法用于在矩阵的基础上进行平移操作。在本文中,我将教会你如何使用Android Matrix的postTranslate方法实现图像的平移效果。## 流程下面是使用Android

# Android ImageView Matrix在Android开发中,ImageView是常用的控件之一,用于显示图片。而ImageView的Matrix可以对图片进行矩阵变换,包括旋转、缩放、平移等操作。本文将介绍如何在Android中使用ImageView的Matrix进行图片的变换操作。## ImageView Matrix简介ImageView的Matrix是一个4x4的

Matrix的数学原理 平移变换 旋转变换 缩放变换 错切变换 对称变换 代码验证 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类。Android中的Matrix是一个3 x 3的矩阵,其内容如下: Matrix的对图像的处理可分为四类

关于动画的实现,Android提供了Animation,在Android SDK介绍了2种Animation模式:1. Tween Animation:通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果,即是一种渐变动画;2. Frame Animation:顺序播放事先做好的图像,是一种画面转换动

分类: android绘制1 概述这里我们会详细讲解matrix的各个方法,以及它的用法。matrix叫做矩阵,在前面讲解 ColorFilter 的文章中,我们讲解了ColorMatrix,他是一个4*5的矩阵。而这里,我们讲解的Matrix不是用于处理颜色的,而是处理图形的。他是一个3*3的矩阵。2 原理先看看matrix的矩阵是什么样子的:这里写图片描述这里可以查看Matrix的代码得到。那

一、首先介绍Scale缩放的控制scale就是缩放,我们调用Matrix的setScale、preScale、postScale,实际在内部,就是通过修改MSCALE_X和MSCALE_Y来实现的。下面就是一个简单的例子1. public class MatrixTestActivity extends Activity { 2. private int screenWidth;

Canvas类中drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)方法中有个参数类型是Matrix,从字面上理解是矩阵的意思,而实际上它也确实是个3x3的矩阵。Matrix在Android中的主要作用是图像变换,如平移、旋转、缩放、扭曲等。 M

你是否曾为游戏帧率限制而烦恼?是否想让单机游戏体验更加流畅丝滑?OpenSpeedy作为一款开源游戏加速工具,通过代码架构的不断优化,为玩家提供了更稳定、更高效的游戏加速解决方案。本文将深入剖析OpenSpeedy从早期单文件结构到现代模块化架构的演进历程,展示如何通过合理的代码组织提升软件质量和可维护性。## 项目概述与架构演进背景OpenSpeedy是一款基于Windows平台的游戏加...

目录1背景说明2 iOS录制屏幕三要素3集成说明4 SDK对接5 SDK运行6如何在移动端测试7 Demo下载1背景说明在ReplayKit live未出来之前,iOS推流屏幕信息,必须使用实际或虚拟的AirPlay模式,使用起来非常不便,自iOS 10开始,苹果在 iOS 9 的 ReplayKit 保存录屏视频的基础上,增加了视频流实时直播功能,iOS 11新增的ReplayKit2,进一步提

THE END
0.封面设计(精选5篇)文字的处理、安排、选用应让人一目了然,如一个字可以看成一个点,一行字可以看成一条线,一段文字可以看成一个面等,因此,在编排版面时,文字与图片应相对合理布局,有的放矢,层次分明,灵动鲜活,以达到图文并茂的效果。 随着期刊业的繁荣发展,我国期刊的封面设计总体水平有了很大的提高、新兴的科技为封面设计注入jvzquC41yy}/3vnujw4dqv4jcq}fp862;9930qyon
1.初中历史新教材培训心得(通用15篇)这是新课标改革带来的好处。同时,我也深刻认识到,新课标改革对老师的知识水平,能力水平的要求都很高,我一定要更加努力学习更多的知识,一边使自己适应新课标改革下对教师的要求。 初中历史新教材培训心得 4 在暑假期间农垦总局组织我们历史教师在农垦教育学院进行了集中培训,我有幸参加,感觉受益匪浅。jvzquC41yy}/qq6220ipo8f14283394759<57;3jvor
2.课程与教学问题范文通过工程制图、建筑材料、房屋建筑学、建筑结构等专业基础课程的学习,学生初步掌握了图纸的识图与绘制、房屋各部分的构造组成以及材料的鉴别能力。但这里忽略了一个问题,高职学生有其自身显著的特点,其优势是动手能力强,擅长趣味性的情境记忆;其弱势是理论基础差,对单向灌输、抽象空洞的理论讲解不愿意学。从学生的心理jvzquC41yy}/i€~qq0ipo8mcqyko1;;5;27/j}rn