1# 图形变换 2 3用于对组件进行旋转、平移、缩放、矩阵变换等操作。 4 5> **说明:** 6> 7> 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 8 9## rotate 10 11rotate(value: RotateOptions) 12 13设置组件旋转。 14 15**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 16 17**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 18 19**系统能力:** SystemCapability.ArkUI.ArkUI.Full 20 21**参数:** 22 23| 参数名 | 类型 | 必填 | 说明 | 24| ------ | --------------------------------------- | ---- | ------------------------------------------------------------ | 25| value | [RotateOptions](#rotateoptions对象说明) | 是 | 可使组件在以组件左上角为坐标原点的坐标系中进行旋转(坐标系如下图所示)。其中,(x, y, z)指定一个矢量,作为旋转轴。<br/>旋转轴和旋转中心点都基于坐标系设定,组件发生位移时,坐标系不会随之移动。<br/>默认值: 在x、y、z都不指定时,x、y、z的默认值分别为0、0、1。指定了x、y、z任何一个值时,x、y、z中未指定的值默认为0。<br/>{<br/>centerX: '50%',<br/>centerY: '50%'<br/>centerZ: 0,<br/>perspective: 0<br/>}<br/>单位:vp<br/><br/>centerZ、perspective从API version 10开始支持在ArkTS卡片中使用。 | 26 27## rotate<sup>18+</sup> 28 29rotate(options: Optional\<RotateOptions>) 30 31设置组件旋转。与[rotate](#rotate)相比,options参数新增了对undefined类型的支持。 32 33**卡片能力:** 从API version 18开始,该接口支持在ArkTS卡片中使用。 34 35**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 36 37**系统能力:** SystemCapability.ArkUI.ArkUI.Full 38 39**参数:** 40 41| 参数名 | 类型 | 必填 | 说明 | 42| ------- | -------------------------------------------------- | ---- | ------------------------------------------------------------ | 43| options | Optional\<[RotateOptions](#rotateoptions对象说明)> | 是 | 可使组件在以组件左上角为坐标原点的坐标系中进行旋转(坐标系如下图所示)。其中,(x, y, z)指定一个矢量,作为旋转轴。<br/>旋转轴和旋转中心点都基于坐标系设定,组件发生位移时,坐标系不会随之移动。<br/>默认值: 在x、y、z都不指定时,x、y、z的默认值分别为0、0、1。指定了x、y、z任何一个值时,x、y、z中未指定的值默认为0。<br/>{<br/>centerX: '50%',<br/>centerY: '50%'<br/>centerZ: 0,<br/>perspective: 0<br/>}<br/>单位:vp<br/><br/>centerZ、perspective从API version 10开始支持在ArkTS卡片中使用。<br/>当options的值为undefined时,恢复为无旋转效果。 | 44 45## translate 46 47translate(value: TranslateOptions) 48 49设置组件平移。 50 51**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 52 53**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 54 55**系统能力:** SystemCapability.ArkUI.ArkUI.Full 56 57**参数:** 58 59| 参数名 | 类型 | 必填 | 说明 | 60| ------ | --------------------------------------------- | ---- | ------------------------------------------------------------ | 61| value | [TranslateOptions](#translateoptions对象说明) | 是 | 可使组件在以组件左上角为坐标原点的坐标系中进行移动(坐标系如下图所示)。其中,x,y,z的值分别表示在对应轴移动的距离,值为正时表示向对应轴的正向移动,值为负时表示向对应轴的反向移动。移动距离支持数字和字符串(比如'10px',‘10%’)两种类型。<br/>默认值:<br/>{<br/>x: 0,<br/>y: 0,<br/>z: 0<br/>}<br/>单位:vp<br/><br/>**说明:**<br/>z轴方向移动时由于观察点位置不变,z的值接近观察点组件会有放大效果,远离则缩小。<br/> | 62 63## translate<sup>18+</sup> 64 65translate(translate: Optional\<TranslateOptions>) 66 67设置组件平移。与[translate](#translate)相比,translate参数新增了对undefined类型的支持。 68 69**卡片能力:** 从API version 18开始,该接口支持在ArkTS卡片中使用。 70 71**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 72 73**系统能力:** SystemCapability.ArkUI.ArkUI.Full 74 75**参数:** 76 77| 参数名 | 类型 | 必填 | 说明 | 78| --------- | -------------------------------------------------------- | ---- | ------------------------------------------------------------ | 79| translate | Optional\<[TranslateOptions](#translateoptions对象说明)> | 是 | 可使组件在以组件左上角为坐标原点的坐标系中进行移动(坐标系如下图所示)。其中,x,y,z的值分别表示在对应轴移动的距离,值为正时表示向对应轴的正向移动,值为负时表示向对应轴的反向移动。移动距离支持数字和字符串(比如'10px',‘10%’)两种类型。<br/>默认值:<br/>{<br/>x: 0,<br/>y: 0,<br/>z: 0<br/>}<br/>单位:vp<br/><br/>**说明:**<br/>z轴方向移动时由于观察点位置不变,z的值接近观察点组件会有放大效果,远离则缩小。<br/><br/>当translate的值为undefined时,恢复为无平移效果。 | 80 81## scale 82 83scale(value: ScaleOptions) 84 85设置组件缩放。 86 87**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 88 89**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 90 91**系统能力:** SystemCapability.ArkUI.ArkUI.Full 92 93**参数:** 94 95| 参数名 | 类型 | 必填 | 说明 | 96| ------ | ------------------------------------- | ---- | ------------------------------------------------------------ | 97| value | [ScaleOptions](#scaleoptions对象说明) | 是 | 可以分别设置X轴、Y轴、Z轴的缩放比例,默认值为1,同时可以通过centerX和centerY设置缩放的中心点。<br/>默认值:<br/>{<br/>x: 1,<br/>y: 1,<br/>z: 1,<br/>centerX:'50%',<br/>centerY:'50%'<br/>} | 98 99## scale<sup>18+</sup> 100 101scale(options: Optional\<ScaleOptions>) 102 103设置组件缩放。与[scale](#scale)相比,options参数新增了对undefined类型的支持。 104 105**卡片能力:** 从API version 18开始,该接口支持在ArkTS卡片中使用。 106 107**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 108 109**系统能力:** SystemCapability.ArkUI.ArkUI.Full 110 111**参数:** 112 113| 参数名 | 类型 | 必填 | 说明 | 114| ------- | ------------------------------------------------ | ---- | ------------------------------------------------------------ | 115| options | Optional\<[ScaleOptions](#scaleoptions对象说明)> | 是 | 可以分别设置X轴、Y轴、Z轴的缩放比例,默认值为1,同时可以通过centerX和centerY设置缩放的中心点。<br/>默认值:<br/>{<br/>x: 1,<br/>y: 1,<br/>z: 1,<br/>centerX:'50%',<br/>centerY:'50%'<br/>}<br/>当options的值为undefined时,恢复为无缩放效果。 | 116 117## transform 118 119transform(value: object) 120 121设置组件的变换矩阵。 122 123**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 124 125**系统能力:** SystemCapability.ArkUI.ArkUI.Full 126 127**参数:** 128 129| 参数名 | 类型 | 必填 | 说明 | 130| ------ | ------ | ---- | ------------------------------------------------------------ | 131| value | object | 是 | 设置当前组件的变换矩阵。object当前仅支持[Matrix4Transit](../js-apis-matrix4.md)矩阵对象类型。 | 132 133## transform<sup>18+</sup> 134 135transform(transform: Optional\<object>) 136 137设置组件的变换矩阵。与[transform](#transform)相比,transform参数新增了对undefined类型的支持。 138 139**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 140 141**系统能力:** SystemCapability.ArkUI.ArkUI.Full 142 143**参数:** 144 145| 参数名 | 类型 | 必填 | 说明 | 146| ------ | --------------------------------------- | ---- | ------------------------ | 147| transform | Optional\<object> | | 设置当前组件的变换矩阵。object当前仅支持[Matrix4Transit](../js-apis-matrix4.md)矩阵对象类型。<br/>当transform的值为undefined时,恢复为单位矩阵的效果。 | 148 149## RotateOptions对象说明 150 151**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 152 153**系统能力:** SystemCapability.ArkUI.ArkUI.Full 154 155| 名称 | 类型 | 必填 | 说明 | 156| ------------------------- | -------------------------- | ---- | ------------------------------------------------------------ | 157| x | number | 否 | 旋转轴向量x坐标。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 | 158| y | number | 否 | 旋转轴向量y坐标。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 | 159| z | number | 否 | 旋转轴向量z坐标。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 | 160| angle | number \| string | 是 | 旋转角度。取值为正时相对于旋转轴方向顺时针转动,取值为负时相对于旋转轴方向逆时针转动。取值可为string类型,如'90deg'。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 | 161| centerX | number \| string | 否 | 变换中心点x轴坐标。表示组件变换中心点(即锚点)的x方向坐标。<br/>单位:vp<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 | 162| centerY | number \| string | 否 | 变换中心点y轴坐标。表示组件变换中心点(即锚点)的y方向坐标。<br/>单位:vp<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 | 163| centerZ<sup>10+</sup> | number | 否 | z轴锚点,即3D旋转中心点的z轴分量。<br/>**卡片能力:** 从API version 10开始,该接口支持在ArkTS卡片中使用。 | 164| perspective<sup>10+</sup> | number | 否 | 视距,即视点到z=0平面的距离。<br/>旋转轴和旋转中心点都基于坐标系设定,组件发生位移时,坐标系不会随之移动。<br/>**卡片能力:** 从API version 10开始,该接口支持在ArkTS卡片中使用。 | 165 166## TranslateOptions对象说明 167 168**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 169 170**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 171 172**系统能力:** SystemCapability.ArkUI.ArkUI.Full 173 174| 名称 | 类型 | 必填 | 说明 | 175| ---- | -------------------------- | ---- | --------------- | 176| x | number \| string | 否 | x轴的平移距离。<br/>类型为number时,单位为vp,取值范围为(-∞, +∞)。<br/>类型为string时,形式参考[Length](ts-types.md#length)的string类型。 | 177| y | number \| string | 否 | y轴的平移距离。<br/>类型为number时,单位为vp,取值范围为(-∞, +∞)。<br/>类型为string时,形式参考[Length](ts-types.md#length)的string类型。 | 178| z | number \| string | 否 | z轴的平移距离。<br/>类型为number时,单位为vp,取值范围为(-∞, +∞)。<br/>类型为string时,形式参考[Length](ts-types.md#length)的string类型。 | 179 180## ScaleOptions对象说明 181 182**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 183 184**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 185 186**系统能力:** SystemCapability.ArkUI.ArkUI.Full 187 188| 名称 | 类型 | 必填 | 说明 | 189| ------- | -------------------------- | ---- | ------------------------------------------------------------ | 190| x | number | 否 | x轴的缩放倍数。x>1时以x轴方向放大,0<x<1时以x轴方向缩小,x<0时沿x轴反向并缩放。 | 191| y | number | 否 | y轴的缩放倍数。y>1时以y轴方向放大,0<y<1时以y轴方向缩小,y<0时沿y轴反向并缩放。 | 192| z | number | 否 | z轴的缩放倍数。z>1时以z轴方向放大,0<z<1时以z轴方向缩小,z<0时沿z轴反向并缩放。 | 193| centerX | number \| string | 否 | 变换中心点x轴坐标。表示组件变换中心点(即锚点)的x方向坐标。<br/>单位:vp | 194| centerY | number \| string | 否 | 变换中心点y轴坐标。表示组件变换中心点(即锚点)的y方向坐标。<br/>单位:vp | 195 196> **说明:** 197> 198> 当组件同时设置了rotate和scale属性时,centerX和centerY的取值会发生冲突,此时centerX和centerY的值以最后设定的属性的值为准。 199 200## 示例 201 202### 示例1(为组件添加图形变换效果) 203 204该示例通过rotate、translate、scale、transform为组件添加旋转、平移、缩放、变换矩阵效果。 205 206```ts 207// xxx.ets 208import { matrix4 } from '@kit.ArkUI'; 209 210@Entry 211@Component 212struct TransformExample { 213 build() { 214 Column() { 215 Text('rotate').width('90%').fontColor(0xCCCCCC).padding(15).fontSize(14) 216 Row() 217 .rotate({ 218 x: 0, 219 y: 0, 220 z: 1, 221 centerX: '50%', 222 centerY: '50%', 223 angle: 300 224 })// 组件以矢量(0,0,1)为旋转轴,绕中心点顺时针旋转300度 225 .width(100).height(100).backgroundColor(0xAFEEEE) 226 227 Text('translate').width('90%').fontColor(0xCCCCCC).padding(10).fontSize(14) 228 Row() 229 .translate({ x: 100, y: 10 })// x轴方向平移100,y轴方向平移10 230 .width(100) 231 .height(100) 232 .backgroundColor(0xAFEEEE) 233 .margin({ bottom: 10 }) 234 235 Text('scale').width('90%').fontColor(0xCCCCCC).padding(15).fontSize(14) 236 Row() 237 .scale({ x: 2, y: 0.5 })// 高度缩小一倍,宽度放大一倍,z轴在2D下无效果 238 .width(100).height(100).backgroundColor(0xAFEEEE) 239 240 Text('Matrix4').width('90%').fontColor(0xCCCCCC).padding(15).fontSize(14) 241 Row() 242 .width(100).height(100).backgroundColor(0xAFEEEE) 243 .transform(matrix4.identity().translate({ x: 50, y: 50 }).scale({ x: 1.5, y: 1 }).rotate({ 244 x: 0, 245 y: 0, 246 z: 1, 247 angle: 60 248 })) 249 }.width('100%').margin({ top: 5 }) 250 } 251} 252``` 253 254 255 256### 示例2(设置旋转视距) 257 258该示例通过perspective为组件添加视距效果。 259 260```ts 261// xxx.ets 262@Entry 263@Component 264struct Index { 265 @State prep: number = 10; 266 267 build() { 268 Row() { 269 Column() { 270 Stack() 271 .width(100) 272 .height(100) 273 .backgroundColor(Color.Red) 274 .rotate({ y: 1, angle: 45, perspective: this.prep }) 275 Button('change prep') 276 .margin({ top: 100 }) 277 .onClick(() => { 278 this.getUIContext()?.animateTo({ 279 duration: 2000, 280 curve: Curve.EaseIn, 281 iterations: 1, 282 playMode: PlayMode.Normal, 283 onFinish: () => { 284 console.info('play end') 285 } 286 }, () => { 287 this.prep = 500 // 组件视距从10变换到500 288 }) 289 }) 290 } 291 .width('100%') 292 } 293 .height('100%') 294 } 295} 296``` 297 298 299 300### 示例3(按中心点旋转) 301 302该示例通过设置rotate和transform为不同的参数实现相同的旋转效果。 303 304```ts 305import { matrix4 } from '@kit.ArkUI' 306 307@Entry 308@Component 309struct MatrixExample { 310 build() { 311 Column({ space: 100 }) { 312 Text('Hello1') 313 .textAlign(TextAlign.Center) 314 .width(100) 315 .height(60) 316 .borderWidth(1) 317 318 Text('Hello2') 319 .textAlign(TextAlign.Center) 320 .width(100) 321 .height(60) 322 .borderWidth(1) 323 .rotate({ 324 // 绕(100vp,60vp)的锚点旋转90度,rotate或scale的centerX、centerY为组件锚点 325 z: 1, 326 angle: 90, 327 centerX: 100, 328 centerY: 60 329 }) 330 331 Text('Hello3') 332 .textAlign(TextAlign.Center) 333 .width(100) 334 .height(60) 335 .borderWidth(1) 336 .transform(matrix4.identity() 337 .rotate({ 338 // 组件锚点(centerX,centerY)默认为(50%,50%),即锚点在(50vp,30vp) 339 // transform的rotate指定(centerX,centerY)为(50vp,30vp),相对于在组件本身锚点基础上再额外偏移(50vp,30vp) 340 // 此次变换相当于绕(100vp,60vp)旋转,和"Hello2"实现同样的旋转效果 341 z: 1, 342 angle: 90, 343 centerX: this.getUIContext().vp2px(50), 344 centerY: this.getUIContext().vp2px(30) 345 })) 346 347 Text('Hello4') 348 .textAlign(TextAlign.Center) 349 .width(100) 350 .height(60) 351 .borderWidth(1) 352 .scale({ 353 // 当设置x或y时,centerX和centerY才能生效 354 // 设置组件锚点为(100vp,60vp) 355 x: 1, 356 y: 1, 357 centerX: 100, 358 centerY: 60 359 })// transform的rotate不指定centerX、centerY,此次旋转的中心相对于组件本身锚点没有额外偏移 360 // 该组件通过scale设置的锚点,绕(100vp,60vp)进行旋转,和"Hello2"实现同样的旋转效果 361 .transform(matrix4.identity().rotate({ z: 1, angle: 90 })) 362 }.width('100%') 363 .height('100%') 364 } 365} 366``` 367 368