• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 单一手势
2
3
4## 点击手势(TapGesture)
5
6
7```ts
8TapGesture(value?:{count?:number; fingers?:number})
9```
10
11
12点击手势支持单次点击和多次点击,拥有两个可选参数:
13
14
15- count:声明该点击手势识别的连续点击次数。默认值为1,若设置小于1的非法值会被转化为默认值。如果配置多次点击,上一次抬起和下一次按下的超时时间为300毫秒。
16
17- fingers:用于声明触发点击的手指数量,最小值为1,最大值为10,默认值为1。当配置多指时,若第一根手指按下300毫秒内未有足够的手指数按下则手势识别失败。当实际点击手指数超过配置值时,手势识别失败。
18    以在Text组件上绑定双击手势(count值为2的点击手势)为例:
19
20  ```ts
21  // xxx.ets
22  @Entry
23  @Component
24  struct Index {
25    @State value: string = "";
26
27    build() {
28      Column() {
29        Text('Click twice').fontSize(28)
30          .gesture(
31            // 绑定count为2的TapGesture
32            TapGesture({ count: 2 })
33              .onAction((event: GestureEvent|undefined) => {
34              if(event){
35                this.value = JSON.stringify(event.fingerList[0]);
36              }
37              }))
38        Text(this.value)
39      }
40      .height(200)
41      .width(250)
42      .padding(20)
43      .border({ width: 3 })
44      .margin(30)
45    }
46  }
47  ```
48
49  ![tap](figures/tap.gif)
50
51
52## 长按手势(LongPressGesture)
53
54
55```ts
56LongPressGesture(value?:{fingers?:number; repeat?:boolean; duration?:number})
57```
58
59
60长按手势用于触发长按手势事件,拥有三个可选参数:
61
62
63- fingers:用于声明触发长按手势所需要的最少手指数量,最小值为1,最大值为10,默认值为1。
64
65- repeat:用于声明是否连续触发事件回调,默认值为false。
66
67- duration:用于声明触发长按所需的最短时间,单位为毫秒,默认值为500。
68
69
70以在Text组件上绑定可以重复触发的长按手势为例:
71
72
73
74```ts
75// xxx.ets
76@Entry
77@Component
78struct Index {
79  @State count: number = 0;
80
81  build() {
82    Column() {
83      Text('LongPress OnAction:' + this.count).fontSize(28)
84        .gesture(
85          // 绑定可以重复触发的LongPressGesture
86          LongPressGesture({ repeat: true })
87           .onAction((event: GestureEvent|undefined) => {
88              if(event){
89                if (event.repeat) {
90                  this.count++;
91                }
92              }
93            })
94            .onActionEnd(() => {
95              this.count = 0;
96            })
97        )
98    }
99    .height(200)
100    .width(250)
101    .padding(20)
102    .border({ width: 3 })
103    .margin(30)
104  }
105}
106```
107
108
109![longPress](figures/longPress.gif)
110
111
112## 拖动手势(PanGesture)
113
114
115```ts
116class pgotmp{
117  fingers?:number = 0
118  direction?:PanDirection|null = null
119  distance?:number = 0
120}
121let pgo:pgotmp = new pgotmp()
122new PanGestureOptions(value?:pgo)
123```
124
125
126拖动手势用于触发拖动手势事件,滑动达到最小滑动距离(默认值为5vp)时拖动手势识别成功,拥有三个可选参数:
127
128
129- fingers:用于声明触发拖动手势所需要的最少手指数量,最小值为1,最大值为10,默认值为1。
130
131- direction:用于声明触发拖动的手势方向,此枚举值支持逻辑与(&)和逻辑或(|)运算。默认值为Pandirection.All132
133- distance:用于声明触发拖动的最小拖动识别距离,单位为vp,默认值为5。
134
135
136以在Text组件上绑定拖动手势为例,可以通过在拖动手势的回调函数中修改组件的布局位置信息来实现组件的拖动:
137
138
139
140```ts
141// xxx.ets
142@Entry
143@Component
144struct Index {
145  @State offsetX: number = 0;
146  @State offsetY: number = 0;
147  @State positionX: number = 0;
148  @State positionY: number = 0;
149
150  build() {
151    Column() {
152      Text('PanGesture Offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
153        .fontSize(28)
154        .height(200)
155        .width(300)
156        .padding(20)
157        .border({ width: 3 })
158          // 在组件上绑定布局位置信息
159        .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
160        .gesture(
161          // 绑定拖动手势
162          PanGesture()
163           .onActionStart((event: GestureEvent|undefined) => {
164              console.info('Pan start');
165            })
166              // 当触发拖动手势时,根据回调函数修改组件的布局位置信息
167            .onActionUpdate((event: GestureEvent|undefined) => {
168              if(event){
169                this.offsetX = this.positionX + event.offsetX;
170                this.offsetY = this.positionY + event.offsetY;
171              }
172            })
173            .onActionEnd(() => {
174              this.positionX = this.offsetX;
175              this.positionY = this.offsetY;
176            })
177        )
178    }
179    .height(200)
180    .width(250)
181  }
182}
183```
184
185
186![pan](figures/pan.gif)
187
188
189>**说明:**
190>
191>大部分可滑动组件,如List、Grid、Scroll、Tab等组件是通过PanGesture实现滑动,在组件内部的子组件绑定[拖动手势(PanGesture)](#拖动手势pangesture)或者[滑动手势(SwipeGesture)](#滑动手势swipegesture)会导致手势竞争。
192>
193>当在子组件绑定PanGesture时,在子组件区域进行滑动仅触发子组件的PanGesture。如果需要父组件响应,需要通过修改手势绑定方法或者子组件向父组件传递消息进行实现,或者通过修改父子组件的PanGesture参数distance使得拖动更灵敏。当子组件绑定SwipeGesture时,由于PanGesture和SwipeGesture触发条件不同,需要修改PanGesture和SwipeGesture的参数以达到所需效果。
194
195
196## 捏合手势(PinchGesture)
197
198
199```ts
200PinchGesture(value?:{fingers?:number; distance?:number})
201```
202
203
204捏合手势用于触发捏合手势事件,拥有两个可选参数:
205
206
207- fingers:用于声明触发捏合手势所需要的最少手指数量,最小值为2,最大值为5,默认值为2。
208
209- distance:用于声明触发捏合手势的最小距离,单位为vp,默认值为3。
210
211
212以在Column组件上绑定三指捏合手势为例,可以通过在捏合手势的函数回调中获取缩放比例,实现对组件的缩小或放大:
213
214
215
216```ts
217// xxx.ets
218@Entry
219@Component
220struct Index {
221  @State scaleValue: number = 1;
222  @State pinchValue: number = 1;
223  @State pinchX: number = 0;
224  @State pinchY: number = 0;
225
226  build() {
227    Column() {
228      Column() {
229        Text('PinchGesture scale:\n' + this.scaleValue)
230        Text('PinchGesture center:\n(' + this.pinchX + ',' + this.pinchY + ')')
231      }
232      .height(200)
233      .width(300)
234      .border({ width: 3 })
235      .margin({ top: 100 })
236      // 在组件上绑定缩放比例,可以通过修改缩放比例来实现组件的缩小或者放大
237      .scale({ x: this.scaleValue, y: this.scaleValue, z: 1 })
238      .gesture(
239        // 在组件上绑定三指触发的捏合手势
240        PinchGesture({ fingers: 3 })
241          .onActionStart((event: GestureEvent|undefined) => {
242            console.info('Pinch start');
243          })
244            // 当捏合手势触发时,可以通过回调函数获取缩放比例,从而修改组件的缩放比例
245          .onActionUpdate((event: GestureEvent|undefined) => {
246            if(event){
247              this.scaleValue = this.pinchValue * event.scale;
248              this.pinchX = event.pinchCenterX;
249              this.pinchY = event.pinchCenterY;
250            }
251          })
252          .onActionEnd(() => {
253            this.pinchValue = this.scaleValue;
254            console.info('Pinch end');
255          })
256      )
257    }
258  }
259}
260```
261
262
263![pinch](figures/pinch.png)
264
265
266## 旋转手势(RotationGesture)
267
268
269```ts
270RotationGesture(value?:{fingers?:number; angle?:number})
271```
272
273
274旋转手势用于触发旋转手势事件,拥有两个可选参数:
275
276
277- fingers:用于声明触发旋转手势所需要的最少手指数量,最小值为2,最大值为5,默认值为2。
278
279- angle:用于声明触发旋转手势的最小改变度数,单位为deg,默认值为1。
280
281
282以在Text组件上绑定旋转手势实现组件的旋转为例,可以通过在旋转手势的回调函数中获取旋转角度,从而实现组件的旋转:
283
284
285
286```ts
287// xxx.ets
288@Entry
289@Component
290struct Index {
291  @State angle: number = 0;
292  @State rotateValue: number = 0;
293
294  build() {
295    Column() {
296      Text('RotationGesture angle:' + this.angle).fontSize(28)
297        // 在组件上绑定旋转布局,可以通过修改旋转角度来实现组件的旋转
298        .rotate({ angle: this.angle })
299        .gesture(
300          RotationGesture()
301           .onActionStart((event: GestureEvent|undefined) => {
302              console.info('RotationGesture is onActionStart');
303            })
304              // 当旋转手势生效时,通过旋转手势的回调函数获取旋转角度,从而修改组件的旋转角度
305            .onActionUpdate((event: GestureEvent|undefined) => {
306              if(event){
307                this.angle = this.rotateValue + event.angle;
308              }
309              console.info('RotationGesture is onActionEnd');
310            })
311              // 当旋转结束抬手时,固定组件在旋转结束时的角度
312            .onActionEnd(() => {
313              this.rotateValue = this.angle;
314              console.info('RotationGesture is onActionEnd');
315            })
316            .onActionCancel(() => {
317              console.info('RotationGesture is onActionCancel');
318            })
319        )
320    }
321    .height(200)
322    .width(250)
323  }
324}
325```
326
327
328![rotation](figures/rotation.png)
329
330
331## 滑动手势(SwipeGesture)
332
333
334```ts
335SwipeGesture(value?:{fingers?:number; direction?:SwipeDirection; speed?:number})
336```
337
338
339滑动手势用于触发滑动事件,当滑动速度大于100vp/s时可以识别成功,拥有三个可选参数:
340
341
342- fingers:用于声明触发滑动手势所需要的最少手指数量,最小值为1,最大值为10,默认值为1。
343
344- direction:用于声明触发滑动手势的方向,此枚举值支持逻辑与(&)和逻辑或(|)运算。默认值为SwipeDirection.All345
346- speed:用于声明触发滑动的最小滑动识别速度,单位为vp/s,默认值为100。
347
348
349以在Column组件上绑定滑动手势实现组件的旋转为例:
350
351
352
353```ts
354// xxx.ets
355@Entry
356@Component
357struct Index {
358  @State rotateAngle: number = 0;
359  @State speed: number = 1;
360
361  build() {
362    Column() {
363      Column() {
364        Text("SwipeGesture speed\n" + this.speed)
365        Text("SwipeGesture angle\n" + this.rotateAngle)
366      }
367      .border({ width: 3 })
368      .width(300)
369      .height(200)
370      .margin(100)
371      // 在Column组件上绑定旋转,通过滑动手势的滑动速度和角度修改旋转的角度
372      .rotate({ angle: this.rotateAngle })
373      .gesture(
374        // 绑定滑动手势且限制仅在竖直方向滑动时触发
375        SwipeGesture({ direction: SwipeDirection.Vertical })
376          // 当滑动手势触发时,获取滑动的速度和角度,实现对组件的布局参数的修改
377          .onAction((event: GestureEvent|undefined) => {
378            if(event){
379              this.speed = event.speed;
380              this.rotateAngle = event.angle;
381            }
382          })
383      )
384    }
385  }
386}
387```
388
389
390![swipe](figures/swipe.gif)
391
392
393>**说明:**
394>
395>当SwipeGesture和PanGesture同时绑定时,若二者是以默认方式或者互斥方式进行绑定时,会发生竞争。SwipeGesture的触发条件为滑动速度达到100vp/s,PanGesture的触发条件为滑动距离达到5vp,先达到触发条件的手势触发。可以通过修改SwipeGesture和PanGesture的参数以达到不同的效果。
396