js-apis-matrix4.md 11.9 KB
Newer Older
Z
zengyawen 已提交
1
# 矩阵变换
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

G
gmy 已提交
19
init(array: Array<number>): Matrix4Transit
Z
zengyawen 已提交
20

Z
zengyawen 已提交
21 22 23

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

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

G
gmy 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
**参数:**

| 参数名 | 类型                | 必填 | 说明                                                         |
| ------ | ------------------- | ---- | ------------------------------------------------------------ |
| 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] |

**返回值:**

| 类型           | 说明                         |
| -------------- | ---------------------------- |
| Matrix4Transit | 根据入参创建的四阶矩阵对象。 |

**array参数说明:**

| 参数名  | 类型     | 必填   | 说明                   |
| ---- | ------ | ---- | -------------------- |
| 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

G
gmy 已提交
94 95 96
| 类型           | 说明           |
| -------------- | -------------- |
| 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 139 140 141 142

| 类型           | 说明                 |
| -------------- | -------------------- |
| Matrix4Transit | 当前矩阵的拷贝对象。 |

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

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

  build() {
    Column() {
      Image($r("app.media.bg1"))
        .width("40%")
        .height(100)
        .transform(this.matrix1)
      Image($r("app.media.bg2"))
        .width("40%")
        .height(100)
        .margin({top:50})
        .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


Z
zengyawen 已提交
173 174 175 176 177
## Matrix4


### combine

G
gmy 已提交
178
combine(matrix: Matrix4): Matrix4Transit
Z
zengyawen 已提交
179 180 181 182


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

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

G
gmy 已提交
185 186 187 188 189
**参数:**

| 参数名 | 类型    | 必填 | 说明               |
| ------ | ------- | ---- | ------------------ |
| matrix | Matrix4 | 是   | 待叠加的矩阵对象。 |
Z
zengyawen 已提交
190

191
**返回值:**
G
gmy 已提交
192 193 194 195 196

| 类型           | 说明               |
| -------------- | ------------------ |
| Matrix4Transit | 矩阵叠加后的对象。 |

197
**示例:**
G
gmy 已提交
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220

```ts
// xxx.ets
import matrix4 from '@ohos.matrix4'
@Entry
@Component
struct Test {
  private matrix1 = matrix4.identity().translate({x:200}).copy()
  private matrix2 = matrix4.identity().scale({x:2}).copy()

  build() {
    Column() {
      // 矩阵变换前
      Image($r("app.media.icon"))
        .width("40%")
        .height(100)
        .margin({top:50})
      // 先平移x轴200px,再缩放两倍x轴,得到矩阵变换后的效果图
      Image($r("app.media.icon"))
        .transform(this.matrix1.combine(this.matrix2))
        .width("40%")
      .height(100)
        .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

G
gmy 已提交
239 240 241
| 类型           | 说明                   |
| -------------- | ---------------------- |
| Matrix4Transit | 当前矩阵的逆矩阵对象。 |
Z
zengyawen 已提交
242

243
**示例:**
G
gmy 已提交
244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268

```ts
import matrix4 from '@ohos.matrix4'
// matrix1(宽放大2倍) 和 matrix2(宽缩小2倍) 效果相反
let matrix1 = matrix4.identity().scale({x:2})
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

G
gmy 已提交
273
translate({x?: number, y?: number, z?: number}): Matrix4Transit
Z
zengyawen 已提交
274 275 276

Matrix的平移函数,可以为当前矩阵增加x轴/Y轴/Z轴平移效果。

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

279
**参数:**
G
gmy 已提交
280 281 282 283 284 285 286

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

287
**返回值:**
G
gmy 已提交
288 289 290 291

| 类型           | 说明                         |
| -------------- | ---------------------------- |
| Matrix4Transit | 增加好平移效果后的矩阵对象。 |
Z
zengyawen 已提交
292

293
**示例:**
G
gmy 已提交
294 295 296 297 298 299 300 301 302 303 304 305 306 307

```ts
// xxx.ets
import matrix4 from '@ohos.matrix4'
@Entry
@Component
struct Test {
  private matrix1 = matrix4.identity().translate({x:100, y:200, z:30})

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

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

Z
zengyawen 已提交
315

Z
zengyawen 已提交
316
### scale
Z
zengyawen 已提交
317

G
gmy 已提交
318
scale({x?: number, y?: number, z?: number, centerX?: number, centerY?: number}): Matrix4Transit
Z
zengyawen 已提交
319 320 321 322


Matrix的缩放函数,可以为当前矩阵增加x轴/Y轴/Z轴缩放效果。

Z
zhaoxinyu 已提交
323 324
**系统能力:**  SystemCapability.ArkUI.ArkUI.Full

G
gmy 已提交
325
**参数:**
Z
zengyawen 已提交
326

G
gmy 已提交
327 328 329 330 331 332 333 334
| 参数名  | 类型   | 必填 | 说明                              |
| ------- | ------ | ---- | --------------------------------- |
| x       | number | 否   | x轴的缩放倍数。<br/>默认值:1     |
| y       | number | 否   | y轴的缩放倍数。<br/>默认值:1     |
| z       | number | 否   | z轴的缩放倍数。<br/>默认值:1     |
| centerX | number | 否   | 变换中心点x轴坐标。<br/>默认值:0 |
| centerY | number | 否   | 变换中心点y轴坐标。<br/>默认值:0 |

335
**返回值:**
G
gmy 已提交
336 337 338 339 340

| 类型           | 说明                         |
| -------------- | ---------------------------- |
| Matrix4Transit | 增加好缩放效果后的矩阵对象。 |

341
**示例:**
G
gmy 已提交
342 343 344 345 346 347 348 349 350 351 352 353 354 355

```ts
// xxx.ets
import matrix4 from '@ohos.matrix4'
@Entry
@Component
struct Test {
  private matrix1 = matrix4.identity().scale({x:2, y:3, z:4, centerX:50, centerY:50})

  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

G
gmy 已提交
366
rotate({x?: number, y?: number, z?: number, angle?: number, centerX?: Length, centerY?: Length}): Matrix4Transit
Z
zengyawen 已提交
367 368 369 370


Matrix的旋转函数,可以为当前矩阵增加x轴/Y轴/Z轴旋转效果。

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

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

G
gmy 已提交
375 376 377 378 379 380 381 382 383
| 参数名  | 类型   | 必填 | 说明                              |
| ------- | ------ | ---- | --------------------------------- |
| x       | number | 否   | 旋转轴向量x坐标。<br/>默认值:1   |
| y       | number | 否   | 旋转轴向量y坐标。<br/>默认值:1   |
| z       | number | 否   | 旋转轴向量z坐标。<br/>默认值:1   |
| angle   | number | 否   | 旋转角度。<br/>默认值:0          |
| centerX | number | 否   | 变换中心点x轴坐标。<br/>默认值:0 |
| centerY | number | 否   | 变换中心点y轴坐标。<br/>默认值:0 |

384
**返回值:**
G
gmy 已提交
385 386 387 388 389

| 类型           | 说明                         |
| -------------- | ---------------------------- |
| Matrix4Transit | 增加好旋转效果后的矩阵对象。 |

390
**示例:**
G
gmy 已提交
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405

```ts
// xxx.ets
import matrix4 from '@ohos.matrix4'
@Entry
@Component
struct Test {
  private matrix1 = matrix4.identity().rotate({x:1, y:1, z:2, angle:30})

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

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


Z
zengyawen 已提交
413 414 415
### transformPoint

transformPoint(point: Point): Point
Z
zengyawen 已提交
416 417 418 419


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

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

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

G
gmy 已提交
424 425 426 427
| 参数名 | 类型  | 必填 | 说明               |
| ------ | ----- | ---- | ------------------ |
| point  | Point | 是   | 需要转换的坐标点。 |

428
**返回值:**
G
gmy 已提交
429 430 431 432 433

| 类型    | 说明               |
| ----- | ---------------- |
| Point | 返回矩阵变换后的Point对象。 |

434
**示例:**
G
gmy 已提交
435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452

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

@Entry
@Component
struct Test {
  private matrix1 = matrix4.identity().transformPoint([100, 10])
  
  build() {
    Column() {
     Button("get Point")
      .onClick(() => {
       prompt.showToast({message:JSON.stringify(this.matrix1),duration:2000})
      }).backgroundColor(0x2788D9)
    }.width("100%").padding(50)
Z
zengyawen 已提交
453
  }
G
gmy 已提交
454 455
}
```
Z
zengyawen 已提交
456

G
gmy 已提交
457
![zh-cn_image_0000001219864133](figures/zh-cn_image_0000001219864133.gif)