• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.matrix4 (矩阵变换)
2
3本模块提供矩阵变换功能,可对图形进行平移、旋转和缩放等。
4
5> **说明:**
6>
7> 本模块首批接口从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9
10## 导入模块
11
12```ts
13import matrix4 from '@ohos.matrix4'
14```
15
16
17## matrix4.init
18
19init(option: [number,number,number,number,number,number,number,number,number,number,number,number,number,number,number,number]): Matrix4Transit
20
21
22Matrix的构造函数,可以通过传入的参数创建一个四阶矩阵,矩阵为列优先。
23
24**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
25
26**参数:**
27
28| 参数名 | 类型                                                         | 必填 | 说明                                                         |
29| ------ | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
30| option | [number,number,number,number,number,number,number,number,number,number,number,number,number,number,number,number] | 是   | 参数为长度为16(4\*4)的number数组,&nbsp;详情见四阶矩阵说明。<br/>默认值:<br/>[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] |
31
32**返回值:**
33
34| 类型                              | 说明                         |
35| --------------------------------- | ---------------------------- |
36| [Matrix4Transit](#matrix4transit) | 根据入参创建的四阶矩阵对象。 |
37
38**四阶矩阵说明:**
39
40| 参数名  | 类型     | 必填   | 说明                   |
41| ---- | ------ | ---- | -------------------- |
42| m00  | number | 是    | x轴缩放值,单位矩阵默认为1。      |
43| m01  | number | 是    | 第2个值,xyz轴旋转会影响这个值。   |
44| m02  | number | 是    | 第3个值,xyz轴旋转会影响这个值。   |
45| m03  | number | 是    | 无实际意义。               |
46| m10  | number | 是    | 第5个值,xyz轴旋转会影响这个值。   |
47| m11  | number | 是    | y轴缩放值,单位矩阵默认为1。      |
48| m12  | number | 是    | 第7个值,xyz轴旋转会影响这个值。   |
49| m13  | number | 是    | 无实际意义。               |
50| m20  | number | 是    | 第9个值,xyz轴旋转会影响这个值。   |
51| m21  | number | 是    | 第10个值,xyz轴旋转会影响这个值。  |
52| m22  | number | 是    | z轴缩放值,单位矩阵默认为1。      |
53| m23  | number | 是    | 无实际意义。               |
54| m30  | number | 是    | x轴平移值,单位px,单位矩阵默认为0。 |
55| m31  | number | 是    | y轴平移值,单位px,单位矩阵默认为0。 |
56| m32  | number | 是    | z轴平移值,单位px,单位矩阵默认为0。 |
57| m33  | number | 是    | 齐次坐标下生效,产生透视投影效果。    |
58
59**示例**
60
61```ts
62import matrix4 from '@ohos.matrix4'
63// 创建一个四阶矩阵
64let matrix = matrix4.init([1.0, 0.0, 0.0, 0.0,
65                          0.0, 1.0, 0.0, 0.0,
66                          0.0, 0.0, 1.0, 0.0,
67                          0.0, 0.0, 0.0, 1.0])
68@Entry
69@Component
70struct Tests {
71  build() {
72    Column() {
73      Image($r("app.media.zh"))
74        .width("40%")
75        .height(100)
76        .transform(matrix)
77    }
78  }
79}
80```
81
82
83## matrix4.identity
84
85identity(): Matrix4Transit
86
87
88Matrix的初始化函数,可以返回一个单位矩阵对象。
89
90**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
91
92**返回值:**
93
94| 类型                              | 说明           |
95| --------------------------------- | -------------- |
96| [Matrix4Transit](#matrix4transit) | 单位矩阵对象。 |
97
98**示例:**
99
100```ts
101// matrix1 和 matrix2 效果一致
102import matrix4 from '@ohos.matrix4'
103let matrix1 = matrix4.init([1.0, 0.0, 0.0, 0.0,
104                          0.0, 1.0, 0.0, 0.0,
105                          0.0, 0.0, 1.0, 0.0,
106                          0.0, 0.0, 0.0, 1.0])
107let matrix2 = matrix4.identity()
108@Entry
109@Component
110struct Tests {
111  build() {
112    Column() {
113      Image($r("app.media.zh"))
114        .width("40%")
115        .height(100)
116        .transform(matrix1)
117      Image($r("app.media.zh"))
118        .width("40%")
119        .height(100)
120        .margin({ top: 150 })
121        .transform(matrix2)
122    }
123  }
124}
125```
126
127
128## matrix4.copy
129
130copy(): Matrix4Transit
131
132
133Matrix的拷贝函数,可以拷贝一份当前的矩阵对象。
134
135**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
136
137**返回值:**
138
139| 类型                              | 说明                 |
140| --------------------------------- | -------------------- |
141| [Matrix4Transit](#matrix4transit) | 当前矩阵的拷贝对象。 |
142
143**示例:**
144
145```ts
146// xxx.ets
147import matrix4 from '@ohos.matrix4'
148@Entry
149@Component
150struct Test {
151  private matrix1 = matrix4.identity().translate({ x: 100 })
152  private matrix2 = this.matrix1.copy().scale({ x: 2 })
153
154  build() {
155    Column() {
156      Image($r("app.media.bg1"))
157        .width("40%")
158        .height(100)
159        .transform(this.matrix1)
160      Image($r("app.media.bg2"))
161        .width("40%")
162        .height(100)
163        .margin({ top: 50 })
164        .transform(this.matrix2)
165    }
166  }
167}
168```
169
170![zh-cn_image_0000001219744181](figures/zh-cn_image_0000001219744181.png)
171
172
173## Matrix4Transit
174
175
176### combine
177
178combine(option: Matrix4Transit): Matrix4Transit
179
180
181Matrix的叠加函数,可以将两个矩阵的效果叠加起来生成一个新的矩阵对象。
182
183**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
184
185**参数:**
186
187| 参数名 | 类型                              | 必填 | 说明               |
188| ------ | --------------------------------- | ---- | ------------------ |
189| option | [Matrix4Transit](#matrix4transit) | 是   | 待叠加的矩阵对象。 |
190
191**返回值:**
192
193| 类型                              | 说明               |
194| --------------------------------- | ------------------ |
195| [Matrix4Transit](#matrix4transit) | 矩阵叠加后的对象。 |
196
197**示例:**
198
199```ts
200// xxx.ets
201import matrix4 from '@ohos.matrix4'
202@Entry
203@Component
204struct Test {
205  private matrix1 = matrix4.identity().translate({ x: 200 }).copy()
206  private matrix2 = matrix4.identity().scale({ x: 2 }).copy()
207
208  build() {
209    Column() {
210      // 矩阵变换前
211      Image($r("app.media.icon"))
212        .width("40%")
213        .height(100)
214        .margin({ top: 50 })
215      // 先平移x轴200px,再缩放两倍x轴,得到矩阵变换后的效果图
216      Image($r("app.media.icon"))
217        .transform(this.matrix1.combine(this.matrix2))
218        .width("40%")
219      .height(100)
220        .margin({ top: 50 })
221    }
222  }
223}
224```
225
226![zh-cn_image_0000001118642902](figures/zh-cn_image_0000001118642902.png)
227
228
229### invert
230
231invert(): Matrix4Transit
232
233Matrix的逆函数,可以返回一个当前矩阵对象的逆矩阵,即效果正好相反。
234
235**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
236
237**返回值:**
238
239| 类型                              | 说明                   |
240| --------------------------------- | ---------------------- |
241| [Matrix4Transit](#matrix4transit) | 当前矩阵的逆矩阵对象。 |
242
243**示例:**
244
245```ts
246import matrix4 from '@ohos.matrix4'
247// matrix1(宽放大2倍) 和 matrix2(宽缩小2倍) 效果相反
248let matrix1 = matrix4.identity().scale({ x: 2 })
249let matrix2 = matrix1.invert()
250@Entry
251@Component
252struct Tests {
253  build() {
254    Column() {
255      Image($r("app.media.zh"))
256        .width(200)
257        .height(100)
258        .transform(matrix1)
259        .margin({ top: 100 })
260      Image($r("app.media.zh"))
261        .width(200)
262        .height(100)
263        .margin({ top: 150 })
264        .transform(matrix2)
265    }
266  }
267}
268```
269
270
271### translate
272
273translate(option: TranslateOption): Matrix4Transit
274
275Matrix的平移函数,可以为当前矩阵增加x轴/y轴/z轴平移效果。
276
277**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
278
279**参数:**
280
281| 参数名 | 类型                                | 必填 | 说明           |
282| ------ | ----------------------------------- | ---- | -------------- |
283| option | [TranslateOption](#translateoption) | 是   | 设置平移参数。 |
284
285**返回值:**
286
287| 类型                              | 说明                         |
288| --------------------------------- | ---------------------------- |
289| [Matrix4Transit](#matrix4transit) | 增加好平移效果后的矩阵对象。 |
290
291**示例:**
292
293```ts
294// xxx.ets
295import matrix4 from '@ohos.matrix4'
296@Entry
297@Component
298struct Test {
299  private matrix1 = matrix4.identity().translate({ x: 100, y: 200, z: 30 })
300
301  build() {
302    Column() {
303      Image($r("app.media.bg1")).transform(this.matrix1)
304        .width("40%")
305        .height(100)
306    }
307  }
308}
309```
310
311![zh-cn_image_0000001219662645](figures/zh-cn_image_0000001219662645.png)
312
313
314### scale
315
316scale(option: ScaleOption): Matrix4Transit
317
318
319Matrix的缩放函数,可以为当前矩阵增加x轴/y轴/z轴缩放效果。
320
321**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
322
323**参数:**
324
325| 参数名 | 类型                        | 必填 | 说明           |
326| ------ | --------------------------- | ---- | -------------- |
327| option | [ScaleOption](#scaleoption) | 是   | 设置缩放参数。 |
328
329**返回值:**
330
331| 类型                              | 说明                         |
332| --------------------------------- | ---------------------------- |
333| [Matrix4Transit](#matrix4transit) | 增加好平移效果后的矩阵对象。 |
334
335**返回值:**
336
337| 类型                              | 说明                         |
338| --------------------------------- | ---------------------------- |
339| [Matrix4Transit](#matrix4transit) | 增加好缩放效果后的矩阵对象。 |
340
341**示例:**
342
343```ts
344// xxx.ets
345import matrix4 from '@ohos.matrix4'
346@Entry
347@Component
348struct Test {
349  private matrix1 = matrix4.identity().scale({ x:2, y:3, z:4, centerX:50, centerY:50 })
350
351  build() {
352    Column() {
353      Image($r("app.media.bg1")).transform(this.matrix1)
354        .width("40%")
355        .height(100)
356    }
357  }
358}
359```
360
361![zh-cn_image_0000001219864131](figures/zh-cn_image_0000001219864131.png)
362
363
364### rotate
365
366rotate(option: RotateOption): Matrix4Transit
367
368
369Matrix的旋转函数,可以为当前矩阵增加x轴/y轴/z轴旋转效果。
370
371**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
372
373**参数:**
374
375| 参数名 | 类型                          | 必填 | 说明           |
376| ------ | ----------------------------- | ---- | -------------- |
377| option | [RotateOption](#rotateoption) | 是   | 设置旋转参数。 |
378
379**返回值:**
380
381| 类型                              | 说明                         |
382| --------------------------------- | ---------------------------- |
383| [Matrix4Transit](#matrix4transit) | 增加好平移效果后的矩阵对象。 |
384
385**返回值:**
386
387| 类型                              | 说明                         |
388| --------------------------------- | ---------------------------- |
389| [Matrix4Transit](#matrix4transit) | 增加好旋转效果后的矩阵对象。 |
390
391**示例:**
392
393```ts
394// xxx.ets
395import matrix4 from '@ohos.matrix4'
396@Entry
397@Component
398struct Test {
399  private matrix1 = matrix4.identity().rotate({ x: 1, y: 1, z: 2, angle: 30 })
400
401  build() {
402    Column() {
403      Image($r("app.media.bg1")).transform(this.matrix1)
404        .width("40%")
405        .height(100)
406    }.width("100%").margin({ top: 50 })
407  }
408}
409```
410
411![zh-cn_image_0000001174422898](figures/zh-cn_image_0000001174422898.png)
412
413
414### transformPoint
415
416transformPoint(option: [number, number]): [number, number]
417
418
419Matrix的坐标点转换函数,可以将当前的变换效果作用到一个坐标点上。
420
421**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
422
423**参数:**
424
425| 参数名 | 类型             | 必填 | 说明               |
426| ------ | ---------------- | ---- | ------------------ |
427| option | [number, number] | 是   | 需要转换的坐标点。 |
428
429**返回值:**
430
431| 类型             | 说明                        |
432| ---------------- | --------------------------- |
433| [number, number] | 返回矩阵变换后的Point对象。 |
434
435**示例:**
436
437```ts
438// xxx.ets
439import matrix4 from '@ohos.matrix4'
440
441@Entry
442@Component
443struct Test {
444  private originPoint: [number, number] = [50, 50]
445  private matrix_1 = matrix4.identity().translate({ x: 150, y: -50 })
446  private transformPoint = this.matrix_1.transformPoint(this.originPoint)
447  private matrix_2 = matrix4.identity().translate({ x: this.transformPoint[0], y: this.transformPoint[1] })
448
449  build() {
450    Column() {
451      Text(`矩阵变换前的坐标:[${this.originPoint}]`)
452        .fontSize(16)
453      Image($r("app.media.image"))
454        .width('600px')
455        .height('300px')
456        .margin({ top: 50 })
457      Text(`矩阵变换后的坐标:[${this.transformPoint}]`)
458        .fontSize(16)
459        .margin({ top: 100 })
460      Image($r("app.media.image"))
461        .width('600px')
462        .height('300px')
463        .margin({ top: 50 })
464        .transform(this.matrix_2)
465    }.width("100%").padding(50)
466  }
467}
468```
469
470![zh-cn_image_0000001219864133](figures/zh-cn_image_0000001219864133.PNG)
471
472## TranslateOption
473
474| 参数名 | 类型   | 必填 | 说明                                                        |
475| ------ | ------ | ---- | ----------------------------------------------------------- |
476| x      | number | 否   | x轴的平移距离,单位px。<br/>默认值:0<br/>取值范围 (-∞, +∞) |
477| y      | number | 否   | y轴的平移距离,单位px。<br/>默认值:0<br/>取值范围 (-∞, +∞) |
478| z      | number | 否   | z轴的平移距离,单位px。<br/>默认值:0<br/>取值范围 (-∞, +∞) |
479
480## ScaleOption
481
482| 参数名  | 类型   | 必填 | 说明                                                         |
483| ------- | ------ | ---- | ------------------------------------------------------------ |
484| x       | number | 否   | x轴的缩放倍数。x>1时以x轴方向放大,x<1时以x轴方向缩小。<br/>默认值:1<br/>取值范围 [0, +∞)<br/>**说明:** <br/>设置小于0的值时,按照默认值处理。 |
485| y       | number | 否   | y轴的缩放倍数。y>1时以y轴方向放大,y<1时以y轴方向缩小。<br/>默认值:1<br/>取值范围 [0, +∞)<br/>**说明:** <br/>设置小于0的值时,按照默认值处理。 |
486| z       | number | 否   | z轴的缩放倍数。z>1时以z轴方向放大,z<1时以z轴方向缩小。<br/>默认值:1<br/>取值范围 [0, +∞)<br/>**说明:** <br/>设置小于0的值时,按照默认值处理。 |
487| centerX | number | 否   | 变换中心点x轴坐标。<br/>默认值:0。<br/>取值范围 (-∞, +∞)    |
488| centerY | number | 否   | 变换中心点y轴坐标。<br/>默认值:0。<br/>取值范围 (-∞, +∞)    |
489
490## RotateOption
491
492| 参数名  | 类型   | 必填 | 说明                                                    |
493| ------- | ------ | ---- | ------------------------------------------------------- |
494| x       | number | 否   | 旋转轴向量x坐标。<br/>默认值:1。<br/>取值范围 (-∞, +∞) |
495| y       | number | 否   | 旋转轴向量y坐标。<br/>默认值:1。<br/>取值范围 (-∞, +∞) |
496| z       | number | 否   | 旋转轴向量z坐标。<br/>默认值:1。<br/>取值范围 (-∞, +∞) |
497| angle   | number | 否   | 旋转角度。<br/>默认值:0                                |
498| centerX | number | 否   | 变换中心点x轴坐标。<br/>默认值:0                       |
499| centerY | number | 否   | 变换中心点y轴坐标。<br/>默认值:0                       |
500