• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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,&nbsp;y,&nbsp;z)指定一个矢量,作为旋转轴。<br/>旋转轴和旋转中心点都基于坐标系设定,组件发生位移时,坐标系不会随之移动。<br/>默认值: 在x、y、z都不指定时,x、y、z的默认值分别为0、0、1。指定了x、y、z任何一个值时,x、y、z中未指定的值默认为0。<br/>{<br/>centerX:&nbsp;'50%',<br/>centerY:&nbsp;'50%'<br/>centerZ:&nbsp;0,<br/>perspective:&nbsp;0<br/>}<br/>单位:vp<br/>![coordinates](figures/coordinates.png)<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,&nbsp;y,&nbsp;z)指定一个矢量,作为旋转轴。<br/>旋转轴和旋转中心点都基于坐标系设定,组件发生位移时,坐标系不会随之移动。<br/>默认值: 在x、y、z都不指定时,x、y、z的默认值分别为0、0、1。指定了x、y、z任何一个值时,x、y、z中未指定的值默认为0。<br/>{<br/>centerX:&nbsp;'50%',<br/>centerY:&nbsp;'50%'<br/>centerZ:&nbsp;0,<br/>perspective:&nbsp;0<br/>}<br/>单位:vp<br/>![coordinates](figures/coordinates.png)<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:&nbsp;0,<br/>y:&nbsp;0,<br/>z:&nbsp;0<br/>}<br/>单位:vp<br/>![coordinates](figures/coordinates.png)<br/>**说明:**<br/>z轴方向移动时由于观察点位置不变,z的值接近观察点组件会有放大效果,远离则缩小。<br/>![coordinateNode](figures/coordinateNote.png) |
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:&nbsp;0,<br/>y:&nbsp;0,<br/>z:&nbsp;0<br/>}<br/>单位:vp<br/>![coordinates](figures/coordinates.png)<br/>**说明:**<br/>z轴方向移动时由于观察点位置不变,z的值接近观察点组件会有放大效果,远离则缩小。<br/>![coordinateNode](figures/coordinateNote.png)<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:&nbsp;1,<br/>y:&nbsp;1,<br/>z:&nbsp;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:&nbsp;1,<br/>y:&nbsp;1,<br/>z:&nbsp;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&nbsp;\|&nbsp;string | 是   | 旋转角度。取值为正时相对于旋转轴方向顺时针转动,取值为负时相对于旋转轴方向逆时针转动。取值可为string类型,如'90deg'。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 |
161| centerX                   | number&nbsp;\|&nbsp;string | 否   | 变换中心点x轴坐标。表示组件变换中心点(即锚点)的x方向坐标。<br/>单位:vp<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 |
162| centerY                   | number&nbsp;\|&nbsp;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&nbsp;\|&nbsp;string | 否   | x轴的平移距离。<br/>类型为number时,单位为vp,取值范围为(-∞, +∞)。<br/>类型为string时,形式参考[Length](ts-types.md#length)的string类型。 |
177| y    | number&nbsp;\|&nbsp;string | 否   | y轴的平移距离。<br/>类型为number时,单位为vp,取值范围为(-∞, +∞)。<br/>类型为string时,形式参考[Length](ts-types.md#length)的string类型。 |
178| z    | number&nbsp;\|&nbsp;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&nbsp;\|&nbsp;string | 否   | 变换中心点x轴坐标。表示组件变换中心点(即锚点)的x方向坐标。<br/>单位:vp |
194| centerY | number&nbsp;\|&nbsp;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![transform](figures/transform.PNG)
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![perspective](figures/perspective.gif)
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![center](figures/center.PNG)