• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 绑定手势方法
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @jiangtao92-->
5<!--Designer: @piggyguy-->
6<!--Tester: @songyanhong-->
7<!--Adviser: @HelloCrease-->
8
9为组件绑定不同类型的手势事件,并设置事件的响应方法。
10
11>  **说明:**
12>
13> 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
14>
15> 可以通过gesture、priorityGesture和parallelGesture给组件绑定手势识别,手势识别成功后可以通过事件回调通知组件。可以通过[触摸热区](ts-universal-attributes-touch-target.md)指定可识别手势的区域。gesture、priorityGesture和parallelGesture当前不支持使用三目运算符(条件? 表达式1 : 表达式2)切换手势绑定。
16
17## gesture
18
19gesture(gesture: GestureType, mask?: GestureMask): T
20
21绑定手势。
22
23**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
24
25**系统能力:** SystemCapability.ArkUI.ArkUI.Full
26
27**参数:**
28
29| 参数名 | 类型                                       | 必填 | 说明                         |
30| ------ | ------------------------------------------ | ---- | ---------------------------- |
31| gesture  |  [GestureType](./ts-gesture-common.md#gesturetype11-1) | 是   | 绑定的手势类型。 |
32| mask  |  [GestureMask](./ts-gesture-common.md#gesturemask11枚举说明) | 否   | 事件响应设置。<br/>默认值:GestureMask.Normal |
33
34**返回值:**
35
36| 类型     | 说明        |
37| ------ | --------- |
38| T | 返回当前组件。 |
39
40## priorityGesture
41
42priorityGesture(gesture: GestureType, mask?: GestureMask): T
43
44绑定优先识别手势。
45
461. 默认情况下,子组件优先识别通过gesture绑定的手势,当父组件配置priorityGesture时,父组件优先识别priorityGesture绑定的手势。
47
482. 绑定长按手势时,设置触发长按的最短时间小的组件会优先响应,会忽略priorityGesture设置。
49
50**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
51
52**系统能力:** SystemCapability.ArkUI.ArkUI.Full
53
54**参数:**
55
56| 参数名 | 类型                                       | 必填 | 说明                         |
57| ------ | ------------------------------------------ | ---- | ---------------------------- |
58| gesture  |  [GestureType](./ts-gesture-common.md#gesturetype11-1) | 是   | 绑定的手势对象。 |
59| mask  |  [GestureMask](./ts-gesture-common.md#gesturemask11枚举说明) | 否   | 事件响应设置。<br/>默认值:GestureMask.Normal |
60
61**返回值:**
62
63| 类型     | 说明        |
64| ------ | --------- |
65| T | 返回当前组件。 |
66
67## parallelGesture
68
69parallelGesture(gesture: GestureType, mask?: GestureMask): T
70
71绑定可与子组件手势同时触发的手势。手势事件为非冒泡事件。父组件设置parallelGesture时,父子组件相同的手势事件都可以触发,实现类似冒泡效果。
72
73**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
74
75**系统能力:** SystemCapability.ArkUI.ArkUI.Full
76
77**参数:**
78
79| 参数名 | 类型                                       | 必填 | 说明                         |
80| ------ | ------------------------------------------ | ---- | ---------------------------- |
81| gesture  |  [GestureType](./ts-gesture-common.md#gesturetype11-1) | 是   | 绑定的手势对象。 |
82| mask  |  [GestureMask](./ts-gesture-common.md#gesturemask11枚举说明) | 否   | 事件响应设置。<br/>默认值:GestureMask.Normal |
83
84**返回值:**
85
86| 类型     | 说明        |
87| ------ | --------- |
88| T | 返回当前组件。 |
89
90## SourceType枚举说明<sup>8+</sup>
91
92**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
93
94**系统能力:** SystemCapability.ArkUI.ArkUI.Full
95
96| 名称 | 值 | 说明 |
97| ---- | --- | -------- |
98| Unknown | - | 未知设备。 |
99| Mouse | - | 鼠标。 |
100| TouchScreen | - | 触摸屏。 |
101
102## SourceTool枚举说明<sup>9+</sup>
103
104**系统能力:** SystemCapability.ArkUI.ArkUI.Full
105
106| 名称 | 值 | 说明 |
107| -------- | - | --------- |
108| Unknown | - | 未知输入源。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
109| Finger | - | 手指输入。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
110| Pen | - | 手写笔输入。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
111| MOUSE<sup>12+</sup> | - | 鼠标输入。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
112| TOUCHPAD<sup>12+</sup> | - | 触控板输入。触控板单指输入被视为鼠标输入操作。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
113| JOYSTICK<sup>12+</sup> | - | 手柄输入。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
114
115## 示例
116
117### 示例1(父组件优先识别手势和父子组件同时触发手势)
118
119该示例通过配置priorityGesture和parallelGesture分别实现了父组件优先识别手势和父子组件同时触发手势。
120
121```ts
122// xxx.ets
123@Entry
124@Component
125struct GestureSettingsExample {
126  @State priorityTestValue: string = ''
127  @State parallelTestValue: string = ''
128
129  build() {
130    Column() {
131      Column() {
132        Text('TapGesture:' + this.priorityTestValue).fontSize(28)
133          .gesture(
134            TapGesture()
135              .onAction((event: GestureEvent) => {
136                this.priorityTestValue += '\nText'
137              }))
138      }
139      .height(200)
140      .width(250)
141      .padding(20)
142      .margin(20)
143      .border({ width: 3 })
144      // 设置为priorityGesture时,点击文本会忽略Text组件的TapGesture手势事件,优先识别父组件Column的TapGesture手势事件
145      .priorityGesture(
146        TapGesture()
147          .onAction((event: GestureEvent) => {
148            this.priorityTestValue += '\nColumn'
149          }), GestureMask.IgnoreInternal)
150
151      Column() {
152        Text('TapGesture:' + this.parallelTestValue).fontSize(28)
153          .gesture(
154            TapGesture()
155              .onAction((event: GestureEvent) => {
156                this.parallelTestValue += '\nText'
157              }))
158      }
159      .height(200)
160      .width(250)
161      .padding(20)
162      .margin(20)
163      .border({ width: 3 })
164      // 设置为parallelGesture时,点击文本会同时触发子组件Text与父组件Column的TapGesture手势事件
165      .parallelGesture(
166        TapGesture()
167          .onAction((event: GestureEvent) => {
168            this.parallelTestValue += '\nColumn'
169          }), GestureMask.Normal)
170    }
171  }
172}
173```
174
175![zh-cn_image_0000001210195016](figures/zh-cn_image_0000001210195016.gif)
176
177### 示例2(实时监测参与滑动手势的有效触点数量)
178
179该示例通过配置fingerInfos实时监测参与滑动手势的有效触点数量
180
181```ts
182// xxx.ets
183@Entry
184@Component
185
186struct PanGestureWithFingerCount {
187  @State offsetX: number = 0
188  @State offsetY: number = 0
189  @State positionX: number = 0
190  @State positionY: number = 0
191  @State fingerCount: number = 0  //用于记录参与手势的触点数量
192
193  private panOption: PanGestureOptions = new PanGestureOptions({
194    direction: PanDirection.All,
195    fingers: 1
196  })
197
198  build() {
199    Column() {
200      // 显示当前有效触点数量
201      Text(`触点数量: ${this.fingerCount}`)
202        .fontSize(20)
203        .margin(10)
204
205      Column() {
206        Text('PanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
207      }
208      .height(200)
209      .width(300)
210      .padding(20)
211      .border({ width: 3 })
212      .margin(50)
213      .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
214      .gesture(
215        PanGesture(this.panOption)
216          .onActionStart((event: GestureEvent) => {
217            console.info('Pan start')
218            this.fingerCount = event.fingerInfos?.length || 0  // 记录触点数量
219          })
220          .onActionUpdate((event: GestureEvent) => {
221            if (event) {
222              console.info('fingerInfos',JSON.stringify(event.fingerInfos))
223              this.offsetX = this.positionX + event.offsetX
224              this.offsetY = this.positionY + event.offsetY
225              this.fingerCount = event.fingerInfos?.length || 0  // 更新触点数量,记录下参与当前手势的有效触点的数量
226            }
227          })
228          .onActionEnd((event: GestureEvent) => {
229            this.positionX = this.offsetX
230            this.positionY = this.offsetY
231            this.fingerCount = 0  // 触点离开触摸区域后归零
232            console.info('Pan end')
233          })
234          .onActionCancel(() => {
235            this.fingerCount = 0  // 手势取消后归零
236          })
237      )
238
239      Button('切换为双指滑动')
240        .onClick(() => {
241          this.panOption.setFingers(2)
242        })
243    }
244  }
245}
246```