• 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(array: Array<number>): Matrix4Transit
20
21
22Matrix的构造函数,可以通过传入的参数创建一个四阶矩阵,矩阵为列优先。
23
24**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
25
26**参数:**
27
28| 参数名 | 类型                | 必填 | 说明                                                         |
29| ------ | ------------------- | ---- | ------------------------------------------------------------ |
30| array  | Array&lt;number&gt; | 是   | 参数为长度为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 | 根据入参创建的四阶矩阵对象。 |
37
38**array参数说明:**
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 | 单位矩阵对象。 |
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 | 当前矩阵的拷贝对象。 |
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## Matrix4
174
175
176### combine
177
178combine(matrix: Matrix4): Matrix4Transit
179
180
181Matrix的叠加函数,可以将两个矩阵的效果叠加起来生成一个新的矩阵对象。
182
183**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
184
185**参数:**
186
187| 参数名 | 类型    | 必填 | 说明               |
188| ------ | ------- | ---- | ------------------ |
189| matrix | Matrix4 | 是   | 待叠加的矩阵对象。 |
190
191**返回值:**
192
193| 类型           | 说明               |
194| -------------- | ------------------ |
195| 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 | 当前矩阵的逆矩阵对象。 |
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({x?: number, y?: number, z?: number}): Matrix4Transit
274
275Matrix的平移函数,可以为当前矩阵增加x轴/Y轴/Z轴平移效果。
276
277**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
278
279**参数:**
280
281| 参数名 | 类型   | 必填 | 说明                                                         |
282| ------ | ------ | ---- | ------------------------------------------------------------ |
283| x      | number | 否   | x轴的平移距离。<br/>默认值:0<br/>单位px<br/>取值范围 (-∞, +∞) |
284| y      | number | 否   | y轴的平移距离,单位px。<br/>默认值:0<br/>单位px<br/>取值范围 (-∞, +∞) |
285| z      | number | 否   | z轴的平移距离,单位px。<br/>默认值:0<br/>单位px<br/>取值范围 (-∞, +∞) |
286
287**返回值:**
288
289| 类型           | 说明                         |
290| -------------- | ---------------------------- |
291| Matrix4Transit | 增加好平移效果后的矩阵对象。 |
292
293**示例:**
294
295```ts
296// xxx.ets
297import matrix4 from '@ohos.matrix4'
298@Entry
299@Component
300struct Test {
301  private matrix1 = matrix4.identity().translate({ x: 100, y: 200, z: 30 })
302
303  build() {
304    Column() {
305      Image($r("app.media.bg1")).transform(this.matrix1)
306        .width("40%")
307        .height(100)
308    }
309  }
310}
311```
312
313![zh-cn_image_0000001219662645](figures/zh-cn_image_0000001219662645.png)
314
315
316### scale
317
318scale({x?: number, y?: number, z?: number, centerX?: number, centerY?: number}): Matrix4Transit
319
320
321Matrix的缩放函数,可以为当前矩阵增加x轴/Y轴/Z轴缩放效果。
322
323**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
324
325**参数:**
326
327| 参数名  | 类型   | 必填 | 说明                                                         |
328| ------- | ------ | ---- | ------------------------------------------------------------ |
329| x       | number | 否   | x轴的缩放倍数。x>1时以x轴方向放大,x<1时以x轴方向缩小。<br/>默认值:1<br/>取值范围 [0, +∞)<br/>**说明:** <br/>设置小于0的值时,按照默认值处理。 |
330| y       | number | 否   | y轴的缩放倍数。y>1时以y轴方向放大,y<1时以y轴方向缩小。<br/>默认值:1<br/>取值范围 [0, +∞)<br/>**说明:** <br/>设置小于0的值时,按照默认值处理。 |
331| z       | number | 否   | z轴的缩放倍数。z>1时以z轴方向放大,z<1时以z轴方向缩小。<br/>默认值:1<br/>取值范围 [0, +∞)<br/>**说明:** <br/>设置小于0的值时,按照默认值处理。 |
332| centerX | number | 否   | 变换中心点x轴坐标。<br/>默认值:0<br/>取值范围 (-∞, +∞)      |
333| centerY | number | 否   | 变换中心点y轴坐标。<br/>默认值:0<br/>取值范围 (-∞, +∞)      |
334
335**返回值:**
336
337| 类型           | 说明                         |
338| -------------- | ---------------------------- |
339| 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({x?: number, y?: number, z?: number, angle?: number, centerX?: Length, centerY?: Length}): Matrix4Transit
367
368
369Matrix的旋转函数,可以为当前矩阵增加x轴/Y轴/Z轴旋转效果。
370
371**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
372
373**参数:**
374
375| 参数名  | 类型   | 必填 | 说明                                                  |
376| ------- | ------ | ---- | ----------------------------------------------------- |
377| x       | number | 否   | 旋转轴向量x坐标。<br/>默认值:1<br/>取值范围 (-∞, +∞) |
378| y       | number | 否   | 旋转轴向量y坐标。<br/>默认值:1<br/>取值范围 (-∞, +∞) |
379| z       | number | 否   | 旋转轴向量z坐标。<br/>默认值:1<br/>取值范围 (-∞, +∞) |
380| angle   | number | 否   | 旋转角度。<br/>默认值:0                              |
381| centerX | number | 否   | 变换中心点x轴坐标。<br/>默认值:0                     |
382| centerY | number | 否   | 变换中心点y轴坐标。<br/>默认值:0                     |
383
384**返回值:**
385
386| 类型           | 说明                         |
387| -------------- | ---------------------------- |
388| Matrix4Transit | 增加好旋转效果后的矩阵对象。 |
389
390**示例:**
391
392```ts
393// xxx.ets
394import matrix4 from '@ohos.matrix4'
395@Entry
396@Component
397struct Test {
398  private matrix1 = matrix4.identity().rotate({ x: 1, y: 1, z: 2, angle: 30 })
399
400  build() {
401    Column() {
402      Image($r("app.media.bg1")).transform(this.matrix1)
403        .width("40%")
404        .height(100)
405    }.width("100%").margin({ top: 50 })
406  }
407}
408```
409
410![zh-cn_image_0000001174422898](figures/zh-cn_image_0000001174422898.png)
411
412
413### transformPoint
414
415transformPoint(point: Point): Point
416
417
418Matrix的坐标点转换函数,可以将当前的变换效果作用到一个坐标点上。
419
420**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
421
422**参数:**
423
424| 参数名 | 类型  | 必填 | 说明               |
425| ------ | ----- | ---- | ------------------ |
426| point  | Point | 是   | 需要转换的坐标点。 |
427
428**返回值:**
429
430| 类型    | 说明               |
431| ----- | ---------------- |
432| Point | 返回矩阵变换后的Point对象。 |
433
434**示例:**
435
436```ts
437// xxx.ets
438import matrix4 from '@ohos.matrix4'
439
440@Entry
441@Component
442struct Test {
443  private originPoint: [number, number] = [50, 50]
444  private matrix_1 = matrix4.identity().translate({ x: 150, y: -50 })
445  private transformPoint = this.matrix_1.transformPoint(this.originPoint)
446  private matrix_2 = matrix4.identity().translate({ x: this.transformPoint[0], y: this.transformPoint[1] })
447
448  build() {
449    Column() {
450      Text(`矩阵变换前的坐标:[${this.originPoint}]`)
451        .fontSize(16)
452      Image($r("app.media.image"))
453        .width('600px')
454        .height('300px')
455        .margin({ top: 50 })
456      Text(`矩阵变换后的坐标:[${this.transformPoint}]`)
457        .fontSize(16)
458        .margin({ top: 100 })
459      Image($r("app.media.image"))
460        .width('600px')
461        .height('300px')
462        .margin({ top: 50 })
463        .transform(this.matrix_2)
464    }.width("100%").padding(50)
465  }
466}
467```
468
469![zh-cn_image_0000001219864133](figures/zh-cn_image_0000001219864133.PNG)
470
471