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  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 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.All。 132 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 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 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 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.All。 345 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 391 392 393>**说明:** 394> 395>当SwipeGesture和PanGesture同时绑定时,若二者是以默认方式或者互斥方式进行绑定时,会发生竞争。SwipeGesture的触发条件为滑动速度达到100vp/s,PanGesture的触发条件为滑动距离达到5vp,先达到触发条件的手势触发。可以通过修改SwipeGesture和PanGesture的参数以达到不同的效果。 396