自定义View之Matrix最全API解析

本文深入探讨了Android中的Matrix类,讲解了平移、旋转、缩放和错切变换的原理,并通过实例展示了如何使用Matrix API进行变换操作,包括预乘和后乘的区别,以及如何处理变换矩阵。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Matrix是Android SDK提供的一个 3 * 3的矩阵类,用来转换坐标。那么,它有9个值: 名称|常量值 – | – MSCALE_X | 0 MSKEW_X | 1 MTRANS_X | 2 MSKEW_Y | 3 MSCALE_Y | 4 MTRANS_Y | 5 MPERSP_0 | 6 MPERSP_1 | 7 MPERSP_2 | 8 用矩阵格式表示就是这样: ![](https://img-blog.youkuaiyun.com/20160720134631097) 在Android中,我们常用的图形所涉及到的几何变换,主要包括Translate(平移)、Scale(缩放)、Rotate(旋转)。其中,Scale(缩放)和Rotate(旋转)是线性变换,而,线性变换可以用矩阵来表示。 值得一提的是,我们所用的坐标系为笛卡尔坐标系,在其平面直角坐标系中,使用(x,y)来表示一个点。

笛卡尔坐标系就是直角坐标系和斜角坐标系的统称。 相交于原点的两条数轴,构成了平面放射坐标系。如两条数轴上的度量单位相等,则称
此放射坐标系为笛卡尔坐标系。两条数轴互相垂直的笛卡尔坐标系,称为笛卡尔直角坐标系,否则称为笛卡尔斜角坐标系。需要指出的是,请> 将数学中的笛卡尔坐标系与电影《异次元杀阵》中的笛卡尔坐标相区分,电影中的定义与数学中定义有出入,请勿混淆。

二维的直角坐标系是由两条相互垂直、0 点重合的数轴构成的。在平面内,任何一点的坐标是根据数轴上对应的点的坐标设定的。在平面内,> 任何一点与坐标的对应关系,类似于数轴上点与坐标的对应关系。采用直角坐标,几何形状可以用代数公式明确的表达出来。几何形状的每一> 个点的直角坐标必须遵守这代数公式。

在笛卡尔坐标系中,线性变换的矩阵的表现形式可以这样:



但是,在笛卡尔坐标系中,平移变换却不能用两个矩阵的乘法表示。平移变换T的表现形式为

尽管,平移变换的矩阵表现形式和线性变换不一样,但是, 2 X 2 的矩阵是足以表示它们,为什么 Matrix 是个 3 X 3 的矩阵?

在图形学中,所涉及的变换包括平移、旋转、缩放。当以矩阵表达式来计算时,平移是矩阵相加,旋转和缩放则是矩阵相乘。如果将平移、旋转和缩放综合起来,可以这么表示:

p’= m1*p + m2

其中:

  • m1:旋转或缩放矩阵
  • m2:平移矩阵
  • p :原向量
  • p’:变换后的向量

在图形学中,将两种简单变换的叠加:一个是线性变换,一个是平移变换,统称为“仿射变换” 。为了解决平移变换不能使用乘法的问题,引入了齐次坐标

p’= m1*p + m2

“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”——F.S. Hill, JR。

根据规则,定义坐标(1,2)可以使用(1,2,1),也可以使用(2,4,2),还可以使用(4,8,4),(8,16,8)…,即 (k,2k,k),k∈R(k,2k,k),k∈R 都是“合法”的齐次坐标表示,这些点都映射到欧式空间中的一点,即这些点具有 尺度不变性(Scale Invariant),是“齐性的”(同族的),所以称之为齐次坐标。

在齐次坐标系中,线性变换是如何表示的呢?比如,旋转和缩放:


这时,平移变换也可以使用矩阵乘法表示,也就是这样:

对于一个仿射变换T,可以表示成一个线性变换A后平移t:T(p)=Ap+t,其中p是待变换的点齐次坐标表示。T可以表示成如下的形式:

其中:

这里写图片描述

Matrix中9个值与仿射变换T的对应关系是这样的:

这里写图片描述

每个值的作用为:

  • MTRANS_X、MTRANS_Y:作用于平移变换(Translate)
  • MSCALE_X、MSCALE_Y:作用于缩放变换(Scale)
  • MSCALE_X、MSKEW_X、MSCALE_Y、MSKEW_Y:作用于旋转变换(Rotate)
  • MSKEW_X、MSKEW_Y:作用于错切变换(Skew)


平移变换

假定有一个点的坐标是这里写图片描述,将其移动到这里写图片描述,再假定在x轴和y轴方向移动的大小分别为 dx和dy。此时

这里写图片描述

那么:

这里写图片描述

用矩阵表示就是:

这里写图片描述

旋转变换

围绕原点旋转变换

这里写图片描述

假定有一个点的坐标是这里写图片描述,其与x轴的夹角为α,假设p点与原点的距离为r,当p绕着原点顺时针旋转θ,达到这里写图片描述

此时:

这里写图片描述

如果用矩阵表示:

这里写图片描述

围绕某个点旋转

这里写图片描述

假定有一个点这里写图片描述,绕着点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值