ts-combined-gestures.md 4.0 KB
Newer Older
Z
zengyawen 已提交
1
# 组合手势
Z
zengyawen 已提交
2

3
手势识别组合,即多种手势组合为复合手势,支持连续识别、并行识别和互斥识别。
T
explain  
tianyu 已提交
4

H
geshi  
HelloCrease 已提交
5
>  **说明:**
6
>
H
HelloCrease 已提交
7
>  从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
Z
zengyawen 已提交
8

Z
zengyawen 已提交
9 10 11 12
## 接口

GestureGroup(mode: GestureMode, ...gesture: GestureType[])

13 14
**参数:**

H
HelloCrease 已提交
15 16 17 18
| 参数名     | 参数类型                                     | 必填   | 参数描述                           |
| ------- | ---------------------------------------- | ---- | ------------------------------ |
| mode    | [GestureMode](#gesturemode枚举说明)          | 是    | 设置组合手势识别模式。                    |
| gesture | [TapGesture](ts-basic-gestures-tapgesture.md)<br/>\|&nbsp;[LongPressGesture](ts-basic-gestures-longpressgesture.md)<br/>\|&nbsp;[PanGesture](ts-basic-gestures-pangesture.md)<br/>\|&nbsp;[PinchGesture](ts-basic-gestures-pinchgesture.md)<br/>\|&nbsp;[RotationGesture](ts-basic-gestures-rotationgesture.md) | 是    | 可变长参数,1个或者多个基础手势类型,这些手势会被组合识别。 |
Z
zengyawen 已提交
19

S
sienna1128 已提交
20
## GestureMode枚举说明
21

H
HelloCrease 已提交
22 23
| 名称        | 描述                                       |
| --------- | ---------------------------------------- |
24
| Sequence  | 顺序识别,按照手势的注册顺序识别手势,直到所有手势识别成功。当有一个手势识别失败时,所有手势识别失败。<br>顺序识别手势组仅有最后一个手势可以响应onActionEnd。 |
H
HelloCrease 已提交
25 26
| Parallel  | 并发识别,注册的手势同时识别,直到所有手势识别结束,手势识别互相不影响。     |
| Exclusive | 互斥识别,注册的手势同时识别,若有一个手势识别成功,则结束手势识别。       |
Z
zengyawen 已提交
27 28 29 30


## 事件

H
HelloCrease 已提交
31 32
| 名称                                       | 功能描述                                 |
| ---------------------------------------- | ------------------------------------ |
T
explain  
tianyu 已提交
33
| onCancel(event:&nbsp;()&nbsp;=&gt;&nbsp;void) | 顺序组合手势(GestureMode.Sequence)取消后触发回调。 |
Z
zengyawen 已提交
34 35 36


## 示例
Z
zengyawen 已提交
37

H
geshi  
HelloCrease 已提交
38 39
```ts
// xxx.ets
Z
zengyawen 已提交
40 41 42
@Entry
@Component
struct GestureGroupExample {
Y
yamila 已提交
43 44 45 46 47 48
  @State count: number = 0
  @State offsetX: number = 0
  @State offsetY: number = 0
  @State positionX: number = 0
  @State positionY: number = 0
  @State borderStyles: BorderStyle = BorderStyle.Solid
Z
zengyawen 已提交
49 50

  build() {
51
    Column() {
Z
zengyawen 已提交
52
      Text('sequence gesture\n' + 'LongPress onAction:' + this.count + '\nPanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
H
HelloCrease 已提交
53
        .fontSize(15)
54 55 56 57 58 59 60
    }
    .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
    .height(150)
    .width(200)
    .padding(20)
    .margin(20)
    .border({ width: 3, style: this.borderStyles })
Z
zengyawen 已提交
61
    .gesture(
Y
yamila 已提交
62
      // 以下组合手势为顺序识别,当长按手势事件未正常触发时则不会触发拖动手势事件
63 64
    GestureGroup(GestureMode.Sequence,
    LongPressGesture({ repeat: true })
L
liuliu 已提交
65 66
      .onAction((event?: GestureEvent) => {
        if (event && event.repeat) {
Y
yamila 已提交
67
          this.count++
68
        }
Y
yamila 已提交
69
        console.info('LongPress onAction')
70 71 72
      }),
    PanGesture()
      .onActionStart(() => {
Y
yamila 已提交
73 74
        this.borderStyles = BorderStyle.Dashed
        console.info('pan start')
75
      })
L
liuliu 已提交
76 77 78 79 80
      .onActionUpdate((event?: GestureEvent) => {
        if (event) {
          this.offsetX = this.positionX + event.offsetX
          this.offsetY = this.positionY + event.offsetY
        }
Y
yamila 已提交
81
        console.info('pan update')
82 83
      })
      .onActionEnd(() => {
Y
yamila 已提交
84 85 86 87
        this.positionX = this.offsetX
        this.positionY = this.offsetY
        this.borderStyles = BorderStyle.Solid
        console.info('pan end')
88 89
      })
    )
Z
zengyawen 已提交
90
      .onCancel(() => {
Y
yamila 已提交
91
        console.info('sequence gesture canceled')
Z
zengyawen 已提交
92 93 94 95 96 97
      })
    )
  }
}
```

T
tianyu 已提交
98 99 100 101 102 103 104 105 106
示意图:

按顺序首先触发长按事件:

![zh-cn_image_0000001174104384](figures/zh-cn_image_0000001174104384.png)

按顺序首先触发长按事件,长按事件识别结束之后,其次触发拖动事件,向右下方拖动:

 ![zh-cn_image1_0000001174104384](figures/zh-cn_image1_0000001174104384.png)