js-apis-matrix4.md 15.3 KB
Newer Older
1
# @ohos.matrix4 (矩阵变换)
Z
zengyawen 已提交
2

Z
zhaoxinyu 已提交
3
本模块提供矩阵变换功能,可对图形进行平移、旋转和缩放等。
T
explain  
tianyu 已提交
4

H
geshi  
HelloCrease 已提交
5
> **说明:**
G
gmy 已提交
6
>
Z
zhaoxinyu 已提交
7
> 本模块首批接口从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
Z
zengyawen 已提交
8

Z
zengyawen 已提交
9 10

## 导入模块
Z
zengyawen 已提交
11

12
```ts
Z
zengyawen 已提交
13
import matrix4 from '@ohos.matrix4'
Z
zengyawen 已提交
14 15
```

Z
zengyawen 已提交
16 17 18

## matrix4.init

Y
yamila 已提交
19
init(option: [number,number,number,number,number,number,number,number,number,number,number,number,number,number,number,number]): Matrix4Transit
Z
zengyawen 已提交
20

Z
zengyawen 已提交
21 22 23

Matrix的构造函数,可以通过传入的参数创建一个四阶矩阵,矩阵为列优先。

Z
zhaoxinyu 已提交
24 25
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

G
gmy 已提交
26 27
**参数:**

Y
yamila 已提交
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] |
G
gmy 已提交
31 32 33

**返回值:**

Y
yamila 已提交
34 35 36
| 类型                              | 说明                         |
| --------------------------------- | ---------------------------- |
| [Matrix4Transit](#matrix4transit) | 根据入参创建的四阶矩阵对象。 |
G
gmy 已提交
37

Y
yamila 已提交
38
**四阶矩阵说明:**
G
gmy 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

| 参数名  | 类型     | 必填   | 说明                   |
| ---- | ------ | ---- | -------------------- |
| m00  | number | 是    | x轴缩放值,单位矩阵默认为1。      |
| m01  | number | 是    | 第2个值,xyz轴旋转会影响这个值。   |
| m02  | number | 是    | 第3个值,xyz轴旋转会影响这个值。   |
| m03  | number | 是    | 无实际意义。               |
| m10  | number | 是    | 第5个值,xyz轴旋转会影响这个值。   |
| m11  | number | 是    | y轴缩放值,单位矩阵默认为1。      |
| m12  | number | 是    | 第7个值,xyz轴旋转会影响这个值。   |
| m13  | number | 是    | 无实际意义。               |
| m20  | number | 是    | 第9个值,xyz轴旋转会影响这个值。   |
| m21  | number | 是    | 第10个值,xyz轴旋转会影响这个值。  |
| m22  | number | 是    | z轴缩放值,单位矩阵默认为1。      |
| m23  | number | 是    | 无实际意义。               |
| m30  | number | 是    | x轴平移值,单位px,单位矩阵默认为0。 |
| m31  | number | 是    | y轴平移值,单位px,单位矩阵默认为0。 |
| m32  | number | 是    | z轴平移值,单位px,单位矩阵默认为0。 |
| m33  | number | 是    | 齐次坐标下生效,产生透视投影效果。    |

**示例**
Z
zengyawen 已提交
60

G
gmy 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
```ts
import matrix4 from '@ohos.matrix4'
// 创建一个四阶矩阵
let matrix = matrix4.init([1.0, 0.0, 0.0, 0.0,
                          0.0, 1.0, 0.0, 0.0,
                          0.0, 0.0, 1.0, 0.0,
                          0.0, 0.0, 0.0, 1.0])
@Entry
@Component
struct Tests {
  build() {
    Column() {
      Image($r("app.media.zh"))
        .width("40%")
        .height(100)
        .transform(matrix)
    }
  }
}
```
Z
zengyawen 已提交
81 82 83 84


## matrix4.identity

G
gmy 已提交
85
identity(): Matrix4Transit
Z
zengyawen 已提交
86

Z
zengyawen 已提交
87 88 89

Matrix的初始化函数,可以返回一个单位矩阵对象。

Z
zhaoxinyu 已提交
90 91
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

92
**返回值:**
Z
zengyawen 已提交
93

Y
yamila 已提交
94 95 96
| 类型                              | 说明           |
| --------------------------------- | -------------- |
| [Matrix4Transit](#matrix4transit) | 单位矩阵对象。 |
Z
zengyawen 已提交
97

98
**示例:**
G
gmy 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

```ts
// matrix1 和 matrix2 效果一致
import matrix4 from '@ohos.matrix4'
let matrix1 = matrix4.init([1.0, 0.0, 0.0, 0.0,
                          0.0, 1.0, 0.0, 0.0,
                          0.0, 0.0, 1.0, 0.0,
                          0.0, 0.0, 0.0, 1.0])
let matrix2 = matrix4.identity()
@Entry
@Component
struct Tests {
  build() {
    Column() {
      Image($r("app.media.zh"))
        .width("40%")
        .height(100)
        .transform(matrix1)
      Image($r("app.media.zh"))
        .width("40%")
        .height(100)
        .margin({ top: 150 })
        .transform(matrix2)
    }
  }
}
```
Z
zengyawen 已提交
126 127


Z
zengyawen 已提交
128
## matrix4.copy
Z
zengyawen 已提交
129

G
gmy 已提交
130
copy(): Matrix4Transit
Z
zengyawen 已提交
131 132 133 134


Matrix的拷贝函数,可以拷贝一份当前的矩阵对象。

Z
zhaoxinyu 已提交
135 136
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

137
**返回值:**
G
gmy 已提交
138

Y
yamila 已提交
139 140 141
| 类型                              | 说明                 |
| --------------------------------- | -------------------- |
| [Matrix4Transit](#matrix4transit) | 当前矩阵的拷贝对象。 |
G
gmy 已提交
142

143
**示例:**
Z
zengyawen 已提交
144

G
gmy 已提交
145 146 147 148 149 150
```ts
// xxx.ets
import matrix4 from '@ohos.matrix4'
@Entry
@Component
struct Test {
Y
yamila 已提交
151 152
  private matrix1 = matrix4.identity().translate({ x: 100 })
  private matrix2 = this.matrix1.copy().scale({ x: 2 })
G
gmy 已提交
153 154 155 156 157 158 159 160 161 162

  build() {
    Column() {
      Image($r("app.media.bg1"))
        .width("40%")
        .height(100)
        .transform(this.matrix1)
      Image($r("app.media.bg2"))
        .width("40%")
        .height(100)
Y
yamila 已提交
163
        .margin({ top: 50 })
G
gmy 已提交
164
        .transform(this.matrix2)
Z
zengyawen 已提交
165
    }
Z
zengyawen 已提交
166
  }
G
gmy 已提交
167 168
}
```
Z
zengyawen 已提交
169

G
gmy 已提交
170
![zh-cn_image_0000001219744181](figures/zh-cn_image_0000001219744181.png)
Z
zengyawen 已提交
171 172


Y
yamila 已提交
173
## Matrix4Transit
Z
zengyawen 已提交
174 175 176 177


### combine

Y
yamila 已提交
178
combine(option: Matrix4Transit): Matrix4Transit
Z
zengyawen 已提交
179 180 181 182


Matrix的叠加函数,可以将两个矩阵的效果叠加起来生成一个新的矩阵对象。

Z
zhaoxinyu 已提交
183 184
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

G
gmy 已提交
185 186
**参数:**

Y
yamila 已提交
187 188 189
| 参数名 | 类型                              | 必填 | 说明               |
| ------ | --------------------------------- | ---- | ------------------ |
| option | [Matrix4Transit](#matrix4transit) | 是   | 待叠加的矩阵对象。 |
Z
zengyawen 已提交
190

191
**返回值:**
G
gmy 已提交
192

Y
yamila 已提交
193 194 195
| 类型                              | 说明               |
| --------------------------------- | ------------------ |
| [Matrix4Transit](#matrix4transit) | 矩阵叠加后的对象。 |
G
gmy 已提交
196

197
**示例:**
G
gmy 已提交
198 199 200 201 202 203 204

```ts
// xxx.ets
import matrix4 from '@ohos.matrix4'
@Entry
@Component
struct Test {
Y
yamila 已提交
205 206
  private matrix1 = matrix4.identity().translate({ x: 200 }).copy()
  private matrix2 = matrix4.identity().scale({ x: 2 }).copy()
G
gmy 已提交
207 208 209 210 211 212 213

  build() {
    Column() {
      // 矩阵变换前
      Image($r("app.media.icon"))
        .width("40%")
        .height(100)
Y
yamila 已提交
214
        .margin({ top: 50 })
G
gmy 已提交
215 216 217 218 219
      // 先平移x轴200px,再缩放两倍x轴,得到矩阵变换后的效果图
      Image($r("app.media.icon"))
        .transform(this.matrix1.combine(this.matrix2))
        .width("40%")
      .height(100)
Y
yamila 已提交
220
        .margin({ top: 50 })
Z
zengyawen 已提交
221
    }
Z
zengyawen 已提交
222
  }
G
gmy 已提交
223 224
}
```
Z
zengyawen 已提交
225

G
gmy 已提交
226
![zh-cn_image_0000001118642902](figures/zh-cn_image_0000001118642902.png)
Z
zengyawen 已提交
227

Z
zengyawen 已提交
228

Z
zengyawen 已提交
229
### invert
Z
zengyawen 已提交
230

G
gmy 已提交
231
invert(): Matrix4Transit
Z
zengyawen 已提交
232 233 234

Matrix的逆函数,可以返回一个当前矩阵对象的逆矩阵,即效果正好相反。

Z
zhaoxinyu 已提交
235 236
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

237
**返回值:**
Z
zengyawen 已提交
238

Y
yamila 已提交
239 240 241
| 类型                              | 说明                   |
| --------------------------------- | ---------------------- |
| [Matrix4Transit](#matrix4transit) | 当前矩阵的逆矩阵对象。 |
Z
zengyawen 已提交
242

243
**示例:**
G
gmy 已提交
244 245 246 247

```ts
import matrix4 from '@ohos.matrix4'
// matrix1(宽放大2倍) 和 matrix2(宽缩小2倍) 效果相反
Y
yamila 已提交
248
let matrix1 = matrix4.identity().scale({ x: 2 })
G
gmy 已提交
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
let matrix2 = matrix1.invert()
@Entry
@Component
struct Tests {
  build() {
    Column() {
      Image($r("app.media.zh"))
        .width(200)
        .height(100)
        .transform(matrix1)
        .margin({ top: 100 })
      Image($r("app.media.zh"))
        .width(200)
        .height(100)
        .margin({ top: 150 })
        .transform(matrix2)
    }
  }
}
```
Z
zengyawen 已提交
269 270


Z
zengyawen 已提交
271
### translate
Z
zengyawen 已提交
272

Y
yamila 已提交
273
translate(option: TranslateOption): Matrix4Transit
Z
zengyawen 已提交
274

Y
yamila 已提交
275
Matrix的平移函数,可以为当前矩阵增加x轴/y轴/z轴平移效果。
Z
zengyawen 已提交
276

Z
zhaoxinyu 已提交
277 278
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

279
**参数:**
G
gmy 已提交
280

Y
yamila 已提交
281 282 283
| 参数名 | 类型                                | 必填 | 说明           |
| ------ | ----------------------------------- | ---- | -------------- |
| option | [TranslateOption](#translateoption) | 是   | 设置平移参数。 |
G
gmy 已提交
284

285
**返回值:**
G
gmy 已提交
286

Y
yamila 已提交
287 288 289
| 类型                              | 说明                         |
| --------------------------------- | ---------------------------- |
| [Matrix4Transit](#matrix4transit) | 增加好平移效果后的矩阵对象。 |
Z
zengyawen 已提交
290

291
**示例:**
G
gmy 已提交
292 293 294 295 296 297 298

```ts
// xxx.ets
import matrix4 from '@ohos.matrix4'
@Entry
@Component
struct Test {
Y
yamila 已提交
299
  private matrix1 = matrix4.identity().translate({ x: 100, y: 200, z: 30 })
G
gmy 已提交
300 301 302 303 304 305

  build() {
    Column() {
      Image($r("app.media.bg1")).transform(this.matrix1)
        .width("40%")
        .height(100)
Z
zengyawen 已提交
306
    }
Z
zengyawen 已提交
307
  }
G
gmy 已提交
308 309
}
```
Z
zengyawen 已提交
310

G
gmy 已提交
311
![zh-cn_image_0000001219662645](figures/zh-cn_image_0000001219662645.png)
Z
zengyawen 已提交
312

Z
zengyawen 已提交
313

Z
zengyawen 已提交
314
### scale
Z
zengyawen 已提交
315

Y
yamila 已提交
316
scale(option: ScaleOption): Matrix4Transit
Z
zengyawen 已提交
317 318


Y
yamila 已提交
319
Matrix的缩放函数,可以为当前矩阵增加x轴/y轴/z轴缩放效果。
Z
zengyawen 已提交
320

Z
zhaoxinyu 已提交
321 322
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

G
gmy 已提交
323
**参数:**
Z
zengyawen 已提交
324

Y
yamila 已提交
325 326 327
| 参数名 | 类型                        | 必填 | 说明           |
| ------ | --------------------------- | ---- | -------------- |
| option | [ScaleOption](#scaleoption) | 是   | 设置缩放参数。 |
G
gmy 已提交
328

329
**返回值:**
G
gmy 已提交
330

Y
yamila 已提交
331 332 333 334 335 336 337 338 339
| 类型                              | 说明                         |
| --------------------------------- | ---------------------------- |
| [Matrix4Transit](#matrix4transit) | 增加好平移效果后的矩阵对象。 |

**返回值:**

| 类型                              | 说明                         |
| --------------------------------- | ---------------------------- |
| [Matrix4Transit](#matrix4transit) | 增加好缩放效果后的矩阵对象。 |
G
gmy 已提交
340

341
**示例:**
G
gmy 已提交
342 343 344 345 346 347 348

```ts
// xxx.ets
import matrix4 from '@ohos.matrix4'
@Entry
@Component
struct Test {
Y
yamila 已提交
349
  private matrix1 = matrix4.identity().scale({ x:2, y:3, z:4, centerX:50, centerY:50 })
G
gmy 已提交
350 351 352 353 354 355

  build() {
    Column() { 
      Image($r("app.media.bg1")).transform(this.matrix1)
        .width("40%")
        .height(100)
Z
zengyawen 已提交
356
    }
Z
zengyawen 已提交
357
  }
G
gmy 已提交
358 359
}
```
Z
zengyawen 已提交
360

G
gmy 已提交
361
![zh-cn_image_0000001219864131](figures/zh-cn_image_0000001219864131.png)
Z
zengyawen 已提交
362

Z
zengyawen 已提交
363

Z
zengyawen 已提交
364
### rotate
Z
zengyawen 已提交
365

Y
yamila 已提交
366
rotate(option: RotateOption): Matrix4Transit
Z
zengyawen 已提交
367 368


Y
yamila 已提交
369
Matrix的旋转函数,可以为当前矩阵增加x轴/y轴/z轴旋转效果。
Z
zengyawen 已提交
370

Z
zhaoxinyu 已提交
371 372
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

G
gmy 已提交
373
**参数:**
Z
zengyawen 已提交
374

Y
yamila 已提交
375 376 377
| 参数名 | 类型                          | 必填 | 说明           |
| ------ | ----------------------------- | ---- | -------------- |
| option | [RotateOption](#rotateoption) | 是   | 设置旋转参数。 |
G
gmy 已提交
378

379
**返回值:**
G
gmy 已提交
380

Y
yamila 已提交
381 382 383 384 385 386 387 388 389
| 类型                              | 说明                         |
| --------------------------------- | ---------------------------- |
| [Matrix4Transit](#matrix4transit) | 增加好平移效果后的矩阵对象。 |

**返回值:**

| 类型                              | 说明                         |
| --------------------------------- | ---------------------------- |
| [Matrix4Transit](#matrix4transit) | 增加好旋转效果后的矩阵对象。 |
G
gmy 已提交
390

391
**示例:**
G
gmy 已提交
392 393 394 395 396 397 398

```ts
// xxx.ets
import matrix4 from '@ohos.matrix4'
@Entry
@Component
struct Test {
Y
yamila 已提交
399
  private matrix1 = matrix4.identity().rotate({ x: 1, y: 1, z: 2, angle: 30 })
G
gmy 已提交
400 401 402 403 404 405

  build() {
    Column() {
      Image($r("app.media.bg1")).transform(this.matrix1)
        .width("40%")
        .height(100)
Y
yamila 已提交
406
    }.width("100%").margin({ top: 50 })
Z
zengyawen 已提交
407
  }
G
gmy 已提交
408 409
}
```
Z
zengyawen 已提交
410

G
gmy 已提交
411
![zh-cn_image_0000001174422898](figures/zh-cn_image_0000001174422898.png)
Z
zengyawen 已提交
412 413


Z
zengyawen 已提交
414 415
### transformPoint

Y
yamila 已提交
416
transformPoint(option: [number, number]): [number, number]
Z
zengyawen 已提交
417 418 419 420


Matrix的坐标点转换函数,可以将当前的变换效果作用到一个坐标点上。

Z
zhaoxinyu 已提交
421 422
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

G
gmy 已提交
423
**参数:**
Z
zengyawen 已提交
424

Y
yamila 已提交
425 426 427
| 参数名 | 类型             | 必填 | 说明               |
| ------ | ---------------- | ---- | ------------------ |
| option | [number, number] | 是   | 需要转换的坐标点。 |
G
gmy 已提交
428

429
**返回值:**
G
gmy 已提交
430

Y
yamila 已提交
431 432 433
| 类型             | 说明                        |
| ---------------- | --------------------------- |
| [number, number] | 返回矩阵变换后的Point对象。 |
G
gmy 已提交
434

435
**示例:**
G
gmy 已提交
436 437 438 439 440 441 442 443

```ts
// xxx.ets
import matrix4 from '@ohos.matrix4'

@Entry
@Component
struct Test {
Y
yamila 已提交
444 445 446 447 448
  private originPoint: [number, number] = [50, 50]
  private matrix_1 = matrix4.identity().translate({ x: 150, y: -50 })
  private transformPoint = this.matrix_1.transformPoint(this.originPoint)
  private matrix_2 = matrix4.identity().translate({ x: this.transformPoint[0], y: this.transformPoint[1] })

G
gmy 已提交
449 450
  build() {
    Column() {
Y
yamila 已提交
451 452 453 454 455 456
      Text(`矩阵变换前的坐标:[${this.originPoint}]`)
        .fontSize(16)
      Image($r("app.media.image"))
        .width('600px')
        .height('300px')
        .margin({ top: 50 })
457
      Text(`矩阵变换后的坐标:[${this.transformPoint}]`)
Y
yamila 已提交
458 459 460 461 462 463 464
        .fontSize(16)
        .margin({ top: 100 })
      Image($r("app.media.image"))
        .width('600px')
        .height('300px')
        .margin({ top: 50 })
        .transform(this.matrix_2)
G
gmy 已提交
465
    }.width("100%").padding(50)
Z
zengyawen 已提交
466
  }
G
gmy 已提交
467 468
}
```
Z
zengyawen 已提交
469

Y
yamila 已提交
470 471
![zh-cn_image_0000001219864133](figures/zh-cn_image_0000001219864133.PNG)

Y
yamila 已提交
472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
## TranslateOption

| 参数名 | 类型   | 必填 | 说明                                                        |
| ------ | ------ | ---- | ----------------------------------------------------------- |
| x      | number | 否   | x轴的平移距离,单位px。<br/>默认值:0<br/>取值范围 (-∞, +∞) |
| y      | number | 否   | y轴的平移距离,单位px。<br/>默认值:0<br/>取值范围 (-∞, +∞) |
| z      | number | 否   | z轴的平移距离,单位px。<br/>默认值:0<br/>取值范围 (-∞, +∞) |

## ScaleOption

| 参数名  | 类型   | 必填 | 说明                                                         |
| ------- | ------ | ---- | ------------------------------------------------------------ |
| x       | number | 否   | x轴的缩放倍数。x>1时以x轴方向放大,x<1时以x轴方向缩小。<br/>默认值:1<br/>取值范围 [0, +∞)<br/>**说明:** <br/>设置小于0的值时,按照默认值处理。 |
| y       | number | 否   | y轴的缩放倍数。y>1时以y轴方向放大,y<1时以y轴方向缩小。<br/>默认值:1<br/>取值范围 [0, +∞)<br/>**说明:** <br/>设置小于0的值时,按照默认值处理。 |
| z       | number | 否   | z轴的缩放倍数。z>1时以z轴方向放大,z<1时以z轴方向缩小。<br/>默认值:1<br/>取值范围 [0, +∞)<br/>**说明:** <br/>设置小于0的值时,按照默认值处理。 |
| centerX | number | 否   | 变换中心点x轴坐标。<br/>默认值:0。<br/>取值范围 (-∞, +∞)    |
| centerY | number | 否   | 变换中心点y轴坐标。<br/>默认值:0。<br/>取值范围 (-∞, +∞)    |

## RotateOption

| 参数名  | 类型   | 必填 | 说明                                                    |
| ------- | ------ | ---- | ------------------------------------------------------- |
| x       | number | 否   | 旋转轴向量x坐标。<br/>默认值:1。<br/>取值范围 (-∞, +∞) |
| y       | number | 否   | 旋转轴向量y坐标。<br/>默认值:1。<br/>取值范围 (-∞, +∞) |
| z       | number | 否   | 旋转轴向量z坐标。<br/>默认值:1。<br/>取值范围 (-∞, +∞) |
| angle   | number | 否   | 旋转角度。<br/>默认值:0                                |
| centerX | number | 否   | 变换中心点x轴坐标。<br/>默认值:0                       |
| centerY | number | 否   | 变换中心点y轴坐标。<br/>默认值:0                       |