Flutter 中对 Matrix4 的理解

637 阅读2分钟

image.png 开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

在很多时候,我们在设计Flutter的一个组件时,可能会用到一些对控件的变换,如移动(translate)拉伸(scale)等等。这一些,Flutter都已经帮我们封装在一个TransfromWidget中了。

若我们需要对某个组件,进行变换,则可以直接使用Transform这个Widget,包在我们需要变换的组件外。如下所示:

Transform(
    alignment: Alignment.topRight, //相对于坐标系原点的对齐方式
    transform: Matrix4.skewY(0.3), //沿Y轴倾斜0.3弧度
    child: Container(
      padding: const EdgeInsets.all(8.0),
      color: Colors.deepOrange,
      child: const Text('Apartment for rent!'),
    ),

image.png

在一般情况下,可能会直接使用Matrix4.xxx()直接进行变化,但这里有个问题就是,Matrix4.xxx()只能实现一种变换效果,若想同时实现多个效果,那就难住了。但惊奇的的是,我们发现有些时候,可以直接传入一个矩阵进行变换。这个矩阵就是Matrix4

那具体如何使用呢?这时候我们需要对Matrix4进行理解。

Matrix4,如其名,这其实是一个4 * 4的矩阵。矩阵中每一个元素都代表着不同的意思。

且注意,Flutter 中 Matrix是列为主的,即(2,3)是 值 [translateZ]。

这个4 * 4的矩阵每个元素值的意思如下:

scaleX/cos(x){y,z轴使用}sin(x){z轴使用}-sin(x){y轴使用}perspectiveX
-sin(x){z轴使用}scaleY/cos(x){x,z轴使用}sin(x){x轴使用}perspectiveY
sin(x){y轴使用}-sin(x){x轴使用}scaleZ/cos(x){x,y轴使用}perspectiveZ
translateXtranslateYtranslateZscaleAll

scaleX/scaleY/scaleZ : 即在不同的轴上对元素进行缩放。scaleAll: 向各个方向扩展,要拓展多少倍,这里面的元素值就要填 1/倍数, 若要放大两倍,则scaleAll处填 0.5.

translate 则为转化,这里不再赘述。

remote 旋转则比较麻烦了。

围绕x轴旋转公式如下:(x为角度变量)

image.png

围绕y轴旋转公式如下:(x为角度变量)

image.png

围绕z轴旋转公式如下:(x为角度变量)

image.png