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<number> | 是 | 参数为长度为16(4\*4)的number数组, 详情见参数描述。<br/>默认值:<br/>[1, 0, 0, 0,<br/>0, 1, 0, 0,<br/>0, 0, 1, 0,<br/>0, 0, 0, 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