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## translate
28
29translate(value: TranslateOptions)
30
31设置组件平移。
32
33**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
34
35**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
36
37**系统能力:** SystemCapability.ArkUI.ArkUI.Full
38
39**参数:**
40
41| 参数名 | 类型                                          | 必填 | 说明                                                         |
42| ------ | --------------------------------------------- | ---- | ------------------------------------------------------------ |
43| 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) |
44
45## scale
46
47scale(value: ScaleOptions)
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  | [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/>} |
62
63## transform
64
65transform(value: object)
66
67设置组件的变换矩阵。
68
69**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
70
71**系统能力:** SystemCapability.ArkUI.ArkUI.Full
72
73**参数:**
74
75| 参数名 | 类型                                    | 必填 | 说明                     |
76| ------ | --------------------------------------- | ---- | ------------------------ |
77| value  | object | 是   | 设置当前组件的变换矩阵。object当前仅支持[Matrix4Transit](../js-apis-matrix4.md)矩阵对象类型。 |
78
79## RotateOptions对象说明
80
81**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
82
83**系统能力:** SystemCapability.ArkUI.ArkUI.Full
84
85| 名称                      | 类型                       | 必填 | 说明                                                         |
86| ------------------------- | -------------------------- | ---- | ------------------------------------------------------------ |
87| x                         | number                     | 否   | 旋转轴向量x坐标。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 |
88| y                         | number                     | 否   | 旋转轴向量y坐标。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 |
89| z                         | number                     | 否   | 旋转轴向量z坐标。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 |
90| angle                     | number&nbsp;\|&nbsp;string | 是   | 旋转角度。取值为正时相对于旋转轴方向顺时针转动,取值为负时相对于旋转轴方向逆时针转动。取值可为string类型,如'90deg'。<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 |
91| centerX                   | number&nbsp;\|&nbsp;string | 否   | 变换中心点x轴坐标。表示组件变换中心点(即锚点)的x方向坐标。<br/>单位:vp<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 |
92| centerY                   | number&nbsp;\|&nbsp;string | 否   | 变换中心点y轴坐标。表示组件变换中心点(即锚点)的y方向坐标。<br/>单位:vp<br/>**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。 |
93| centerZ<sup>10+</sup>     | number                     | 否   | z轴锚点,即3D旋转中心点的z轴分量。<br/>**卡片能力:** 从API version 10开始,该接口支持在ArkTS卡片中使用。 |
94| perspective<sup>10+</sup> | number                     | 否   | 视距,即视点到z=0平面的距离。<br/>旋转轴和旋转中心点都基于坐标系设定,组件发生位移时,坐标系不会随之移动。<br/>**卡片能力:** 从API version 10开始,该接口支持在ArkTS卡片中使用。 |
95
96## TranslateOptions对象说明
97
98**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
99
100**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
101
102**系统能力:** SystemCapability.ArkUI.ArkUI.Full
103
104| 名称 | 类型                       | 必填 | 说明            |
105| ---- | -------------------------- | ---- | --------------- |
106| x    | number&nbsp;\|&nbsp;string | 否   | x轴的平移距离。 |
107| y    | number&nbsp;\|&nbsp;string | 否   | y轴的平移距离。 |
108| z    | number&nbsp;\|&nbsp;string | 否   | z轴的平移距离。 |
109
110## ScaleOptions对象说明
111
112**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
113
114**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
115
116**系统能力:** SystemCapability.ArkUI.ArkUI.Full
117
118| 名称    | 类型                       | 必填 | 说明                                                         |
119| ------- | -------------------------- | ---- | ------------------------------------------------------------ |
120| x       | number                     | 否   | x轴的缩放倍数。x>1时以x轴方向放大,0<x<1时以x轴方向缩小,x<0时沿x轴反向并缩放。 |
121| y       | number                     | 否   | y轴的缩放倍数。y>1时以y轴方向放大,0<y<1时以y轴方向缩小,y<0时沿y轴反向并缩放。 |
122| z       | number                     | 否   | z轴的缩放倍数。z>1时以z轴方向放大,0<z<1时以z轴方向缩小,z<0时沿z轴反向并缩放。 |
123| centerX | number&nbsp;\|&nbsp;string | 否   | 变换中心点x轴坐标。表示组件变换中心点(即锚点)的x方向坐标。<br/>单位:vp |
124| centerY | number&nbsp;\|&nbsp;string | 否   | 变换中心点y轴坐标。表示组件变换中心点(即锚点)的y方向坐标。<br/>单位:vp |
125
126> **说明:**
127>
128> 当组件同时设置了rotate和scale属性时,centerX和centerY的取值会发生冲突,此时centerX和centerY的值以最后设定的属性的值为准。
129
130## 示例
131
132### 示例1(为组件添加图形变换效果)
133
134该示例通过rotate、translate、scale、transform为组件添加旋转、平移、缩放、变换矩阵效果。
135
136```ts
137// xxx.ets
138import { matrix4 } from '@kit.ArkUI';
139
140@Entry
141@Component
142struct TransformExample {
143  build() {
144    Column() {
145      Text('rotate').width('90%').fontColor(0xCCCCCC).padding(15).fontSize(14)
146      Row()
147        .rotate({
148          x: 0,
149          y: 0,
150          z: 1,
151          centerX: '50%',
152          centerY: '50%',
153          angle: 300
154        })// 组件以矢量(0,0,1)为旋转轴,绕中心点顺时针旋转300度
155        .width(100).height(100).backgroundColor(0xAFEEEE)
156
157      Text('translate').width('90%').fontColor(0xCCCCCC).padding(10).fontSize(14)
158      Row()
159        .translate({ x: 100, y: 10 })// x轴方向平移100,y轴方向平移10
160        .width(100)
161        .height(100)
162        .backgroundColor(0xAFEEEE)
163        .margin({ bottom: 10 })
164
165      Text('scale').width('90%').fontColor(0xCCCCCC).padding(15).fontSize(14)
166      Row()
167        .scale({ x: 2, y: 0.5 })// 高度缩小一倍,宽度放大一倍,z轴在2D下无效果
168        .width(100).height(100).backgroundColor(0xAFEEEE)
169
170      Text('Matrix4').width('90%').fontColor(0xCCCCCC).padding(15).fontSize(14)
171      Row()
172        .width(100).height(100).backgroundColor(0xAFEEEE)
173        .transform(matrix4.identity().translate({ x: 50, y: 50 }).scale({ x: 1.5, y: 1 }).rotate({
174          x: 0,
175          y: 0,
176          z: 1,
177          angle: 60
178        }))
179    }.width('100%').margin({ top: 5 })
180  }
181}
182```
183
184![transform](figures/transform.PNG)
185
186### 示例2(设置旋转视距)
187
188该示例通过perspective为组件添加视距效果。
189
190```ts
191// xxx.ets
192@Entry
193@Component
194struct Index {
195  @State prep: number = 10;
196
197  build() {
198    Row() {
199      Column() {
200        Stack()
201          .width(100)
202          .height(100)
203          .backgroundColor(Color.Red)
204          .rotate({ y: 1, angle: 45, perspective: this.prep })
205        Button('change prep')
206          .margin({ top: 100 })
207          .onClick(() => {
208            animateTo({
209              duration: 2000,
210              curve: Curve.EaseIn,
211              iterations: 1,
212              playMode: PlayMode.Normal,
213              onFinish: () => {
214                console.info('play end')
215              }
216            }, () => {
217              this.prep = 500 // 组件视距从10变换到500
218            })
219          })
220      }
221      .width('100%')
222    }
223    .height('100%')
224  }
225}
226```
227
228![perspective](figures/perspective.gif)
229
230### 示例3(按中心点旋转)
231
232该示例通过设置rotate和transform为不同的参数实现相同的旋转效果。
233
234```ts
235import { matrix4 } from '@kit.ArkUI'
236
237@Entry
238@Component
239struct MatrixExample {
240  build() {
241    Column({ space: 100 }) {
242      Text('Hello1')
243        .textAlign(TextAlign.Center)
244        .width(100)
245        .height(60)
246        .borderWidth(1)
247
248      Text('Hello2')
249        .textAlign(TextAlign.Center)
250        .width(100)
251        .height(60)
252        .borderWidth(1)
253        .rotate({
254          // 绕(100vp,60vp)的锚点旋转90度,rotate或scale的centerX、centerY为组件锚点
255          z: 1,
256          angle: 90,
257          centerX: 100,
258          centerY: 60
259        })
260
261      Text('Hello3')
262        .textAlign(TextAlign.Center)
263        .width(100)
264        .height(60)
265        .borderWidth(1)
266        .transform(matrix4.identity()
267          .rotate({
268            // 组件锚点(centerX,centerY)默认为(50%,50%),即锚点在(50vp,30vp)
269            // transform的rotate指定(centerX,centerY)为(50vp,30vp),相对于在组件本身锚点基础上再额外偏移(50vp,30vp)
270            // 此次变换相当于绕(100vp,60vp)旋转,和"Hello2"实现同样的旋转效果
271            z: 1,
272            angle: 90,
273            centerX: vp2px(50),
274            centerY: vp2px(30)
275          }))
276
277      Text('Hello4')
278        .textAlign(TextAlign.Center)
279        .width(100)
280        .height(60)
281        .borderWidth(1)
282        .scale({
283          // 当设置x或y时,centerX和centerY才能生效
284          // 设置组件锚点为(100vp,60vp)
285          x: 1,
286          y: 1,
287          centerX: 100,
288          centerY: 60
289        })// transform的rotate不指定centerX、centerY,此次旋转的中心相对于组件本身锚点没有额外偏移
290          // 该组件通过scale设置的锚点,绕(100vp,60vp)进行旋转,和"Hello2"实现同样的旋转效果
291        .transform(matrix4.identity().rotate({ z: 1, angle: 90 }))
292    }.width('100%')
293    .height('100%')
294  }
295}
296```
297
298![center](figures/center.PNG)