开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
在很多时候,我们在设计Flutter的一个组件时,可能会用到一些对控件的变换,如移动(translate)、拉伸(scale)等等。这一些,Flutter都已经帮我们封装在一个Transfrom的Widget中了。
若我们需要对某个组件,进行变换,则可以直接使用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!'),
),
在一般情况下,可能会直接使用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 |
| translateX | translateY | translateZ | scaleAll |
scaleX/scaleY/scaleZ : 即在不同的轴上对元素进行缩放。scaleAll: 向各个方向扩展,要拓展多少倍,这里面的元素值就要填 1/倍数, 若要放大两倍,则scaleAll处填 0.5.
translate 则为转化,这里不再赘述。
remote 旋转则比较麻烦了。
围绕x轴旋转公式如下:(x为角度变量)
围绕y轴旋转公式如下:(x为角度变量)
围绕z轴旋转公式如下:(x为角度变量)