• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 矩阵变换
2
3>  **说明:**
4> 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
5
6
7## 导入模块
8
9```ts
10import matrix4 from '@ohos.matrix4'
11```
12
13
14## 权限列表
15
1617
18
19## matrix4.init
20
21init(array: Array<number>): Object
22
23
24Matrix的构造函数,可以通过传入的参数创建一个四阶矩阵,矩阵为列优先。
25
26
27- 参数
28  | 参数名 | 类型 | 必填 | 默认值 | 说明 |
29  | -------- | -------- | -------- | -------- | -------- |
30  | array | Array&lt;number&gt; | 是 | [1,&nbsp;0,&nbsp;0,&nbsp;0,<br/>0,&nbsp;1,&nbsp;0,&nbsp;0,<br/>0,&nbsp;0,&nbsp;1,&nbsp;0,<br/>0,&nbsp;0,&nbsp;0,&nbsp;1] | 参数为长度为16(4\*4)的number数组,&nbsp;详情见参数描述。 |
31
32- 返回值
33  | 类型 | 说明 |
34  | -------- | -------- |
35  | Object | 根据入参创建的四阶矩阵对象。 |
36
37- 参数描述
38  | 参数名 | 类型 | 必填 | 说明 |
39  | -------- | -------- | -------- | -------- |
40  | m00 | number | 是 | x轴缩放值,单位矩阵默认为1。 |
41  | m01 | number | 是 | 第2个值,xyz轴旋转会影响这个值。 |
42  | m02 | number | 是 | 第3个值,xyz轴旋转会影响这个值。 |
43  | m03 | number | 是 | 无实际意义。 |
44  | m10 | number | 是 | 第5个值,xyz轴旋转会影响这个值。 |
45  | m11 | number | 是 | y轴缩放值,单位矩阵默认为1。 |
46  | m12 | number | 是 | 第7个值,xyz轴旋转会影响这个值。 |
47  | m13 | number | 是 | 无实际意义。 |
48  | m20 | number | 是 | 第9个值,xyz轴旋转会影响这个值。 |
49  | m21 | number | 是 | 第10个值,xyz轴旋转会影响这个值。 |
50  | m22 | number | 是 | z轴缩放值,单位矩阵默认为1。 |
51  | m23 | number | 是 | 无实际意义。 |
52  | m30 | number | 是 | x轴平移值,单位px,单位矩阵默认为0。 |
53  | m31 | number | 是 | y轴平移值,单位px,单位矩阵默认为0。 |
54  | m32 | number | 是 | z轴平移值,单位px,单位矩阵默认为0。 |
55  | m33 | number | 是 | 齐次坐标下生效,产生透视投影效果。 |
56
57- 示例
58  ```ts
59  import matrix4 from '@ohos.matrix4'
60  // 创建一个四阶矩阵
61  let matrix = matrix4.init([1.0, 0.0, 0.0, 0.0,
62                            0.0, 1.0, 0.0, 0.0,
63                            0.0, 0.0, 1.0, 0.0,
64                            0.0, 0.0, 0.0, 1.0])
65  ```
66
67
68## matrix4.identity
69
70identity(): Object
71
72
73Matrix的初始化函数,可以返回一个单位矩阵对象。
74
75
76- 返回值
77  | 类型 | 说明 |
78  | -------- | -------- |
79  | Object | 单位矩阵对象。 |
80
81- 示例
82  ```ts
83  // matrix1 和 matrix2 效果一致
84  import matrix4 from '@ohos.matrix4'
85  let matrix = matrix4.init([1.0, 0.0, 0.0, 0.0,
86                            0.0, 1.0, 0.0, 0.0,
87                            0.0, 0.0, 1.0, 0.0,
88                            0.0, 0.0, 0.0, 1.0])
89  let matrix2 = matrix4.identity()
90  ```
91
92
93## matrix4.copy
94
95copy(): Object
96
97
98Matrix的拷贝函数,可以拷贝一份当前的矩阵对象。
99
100
101- 返回值
102  | 类型 | 说明 |
103  | -------- | -------- |
104  | Object | 当前矩阵的拷贝对象。 |
105
106- 示例
107  ```ts
108  import matrix4 from '@ohos.matrix4'
109  @Entry
110  @Component
111  struct Test {
112    private matrix1 = matrix4.identity().translate({x:100})
113    private matrix2 = this.matrix1.copy().scale({x:2})
114    build() {
115      Column() {
116        Image($r("app.media.bg1"))
117          .width("40%")
118          .height(100)
119          .transform(this.matrix1)
120        Image($r("app.media.bg2"))
121          .width("40%")
122          .height(100)
123          .margin({top:50})
124          .transform(this.matrix2)
125      }
126    }
127  }
128  ```
129
130  ![zh-cn_image_0000001219744181](figures/zh-cn_image_0000001219744181.png)
131
132
133## Matrix4
134
135
136### combine
137
138combine(matrix: Matrix4): Object
139
140
141Matrix的叠加函数,可以将两个矩阵的效果叠加起来生成一个新的矩阵对象。
142
143
144- 参数
145  | 参数名 | 类型 | 必填 | 默认值 | 说明 |
146  | -------- | -------- | -------- | -------- | -------- |
147  | matrix | Matrix4 | 是 | - | 待叠加的矩阵对象。 |
148
149- 返回值
150  | 类型 | 说明 |
151  | -------- | -------- |
152  | Object | 矩阵叠加后的对象。 |
153
154- 示例
155  ```ts
156  import matrix4 from '@ohos.matrix4'
157  @Entry
158  @Component
159  struct Test {
160    private matrix1 = matrix4.identity().translate({x:200}).copy()
161    private matrix2 = matrix4.identity().scale({x:2}).copy()
162    build() {
163      Column() {
164       // 先平移x轴100px,再缩放两倍x轴
165        Image($r("app.media.bg1")).transform(this.matrix1.combine(this.matrix2))
166          .width("40%")
167          .height(100)
168          .margin({top:50})
169      }
170    }
171  }
172  ```
173
174  ![zh-cn_image_0000001174582846](figures/zh-cn_image_0000001174582846.png)
175
176
177### invert
178
179invert(): Object
180
181
182Matrix的逆函数,可以返回一个当前矩阵对象的逆矩阵,即效果正好相反。
183
184
185- 返回值
186  | 类型 | 说明 |
187  | -------- | -------- |
188  | Object | 当前矩阵的逆矩阵对象。 |
189
190- 示例
191  ```ts
192  import matrix4 from '@ohos.matrix4'
193  // matrix1(宽放大2倍) 和 matrix2(宽缩小2倍) 效果相反
194  let matrix1 = matrix4.identity().scale({x:2})
195  let matrix2 = matrix1.copy().invert()
196  ```
197
198
199### translate
200
201translate({x?: number, y?: number, z?: number}): Object
202
203
204Matrix的平移函数,可以为当前矩阵增加x轴/Y轴/Z轴平移效果。
205
206
207- 参数
208  | 参数名 | 类型 | 必填 | 默认值 | 说明 |
209  | -------- | -------- | -------- | -------- | -------- |
210  | x | number | 否 | 0 | x轴的平移距离,单位px。 |
211  | y | number | 否 | 0 | y轴的平移距离,单位px。 |
212  | z | number | 否 | 0 | z轴的平移距离,单位px。 |
213
214
215- 返回值
216  | 类型 | 说明 |
217  | -------- | -------- |
218  | Object | 增加好平移效果后的矩阵对象。 |
219
220- 示例
221  ```ts
222  import matrix4 from '@ohos.matrix4'
223  @Entry
224  @Component
225  struct Test {
226    private matrix1 = matrix4.identity().translate({x:100, y:200, z:30})
227    build() {
228      Column() {
229        Image($r("app.media.bg1")).transform(this.matrix1)
230          .width("40%")
231          .height(100)
232      }
233    }
234  }
235  ```
236
237  ![zh-cn_image_0000001219662645](figures/zh-cn_image_0000001219662645.png)
238
239
240### scale
241
242scale({x?: number, y?: number, z?: number, centerX?: number, centerY?: number}): Object
243
244
245Matrix的缩放函数,可以为当前矩阵增加x轴/Y轴/Z轴缩放效果。
246
247
248- 参数
249  | 参数名 | 类型 | 必填 | 默认值 | 说明 |
250  | -------- | -------- | -------- | -------- | -------- |
251  | x | number | 否 | 1 | x轴的缩放倍数。 |
252  | y | number | 否 | 1 | y轴的缩放倍数。 |
253  | z | number | 否 | 1 | z轴的缩放倍数。 |
254  | centerX | number | 否 | 0 | 变换中心点x轴坐标。 |
255  | centerY | number | 否 | 0 | 变换中心点y轴坐标。 |
256
257
258- 返回值
259  | 类型 | 说明 |
260  | -------- | -------- |
261  | Object | 增加好缩放效果后的矩阵对象。 |
262
263- 示例
264  ```ts
265  import matrix4 from '@ohos.matrix4'
266  @Entry
267  @Component
268  struct Test {
269    private matrix1 = matrix4.identity().scale({x:2, y:3, z:4, centerX:50, centerY:50})
270    build() {
271      Column() {
272        Image($r("app.media.bg1")).transform(this.matrix1)
273          .width("40%")
274          .height(100)
275      }
276    }
277  }
278  ```
279
280  ![zh-cn_image_0000001219864131](figures/zh-cn_image_0000001219864131.png)
281
282
283### rotate
284
285rotate({x?: number, y?: number, z?: number, angle?: number, centerX?: Length, centerY?: Length}): Object
286
287
288Matrix的旋转函数,可以为当前矩阵增加x轴/Y轴/Z轴旋转效果。
289
290
291- 参数
292  | 参数名 | 类型 | 必填 | 默认值 | 说明 |
293  | -------- | -------- | -------- | -------- | -------- |
294  | x | number | 否 | 1 | 旋转轴向量x坐标。 |
295  | y | number | 否 | 1 | 旋转轴向量y坐标。 |
296  | z | number | 否 | 1 | 旋转轴向量z坐标。 |
297  | angle | number | 否 | 0 | 旋转角度。 |
298  | centerX | number | 否 | 0 | 变换中心点x轴坐标。 |
299  | centerY | number | 否 | 0 | 变换中心点y轴坐标。 |
300
301
302- 返回值
303  | 类型 | 说明 |
304  | -------- | -------- |
305  | Object | 增加好旋转效果后的矩阵对象。 |
306
307- 示例
308  ```ts
309  import matrix4 from '@ohos.matrix4'
310  @Entry
311  @Component
312  struct Test {
313    private matrix1 = matrix4.identity().rotate({x:1, y:1, z:2, angle:30})
314    build() {
315      Column() {
316        Image($r("app.media.bg1")).transform(this.matrix1)
317          .width("40%")
318          .height(100)
319      }.width("100%").margin({top:50})
320    }
321  }
322  ```
323
324  ![zh-cn_image_0000001174422898](figures/zh-cn_image_0000001174422898.png)
325
326
327### transformPoint
328
329transformPoint(point: Point): Point
330
331
332Matrix的坐标点转换函数,可以将当前的变换效果作用到一个坐标点上。
333
334
335- 参数
336  | 参数名 | 类型 | 必填 | 默认值 | 说明 |
337  | -------- | -------- | -------- | -------- | -------- |
338  | point | Point | 是 | - | 需要转换的坐标点。 |
339
340
341- 返回值
342  | 类型 | 说明 |
343  | -------- | -------- |
344  | Point | 返回矩阵变换后的Point对象。 |
345
346- 示例
347  ```ts
348  import matrix4 from '@ohos.matrix4'
349  import prompt from '@system.prompt'
350
351  @Entry
352  @Component
353  struct Test {
354    private matrix1 = matrix4.identity().transformPoint([100, 10])
355    build() {
356      Column() {
357       Button("get Point")
358        .onClick(() => {
359         prompt.showToast({message:JSON.stringify(this.matrix1),duration:2000})
360        }).backgroundColor(0x2788D9)
361      }.width("100%").padding(50)
362    }
363  }
364  ```
365
366  ![zh-cn_image_0000001219864133](figures/zh-cn_image_0000001219864133.gif)
367