绑定手势事件

为组件绑定不同类型的手势事件,并设置事件的响应方法。

说明:

  • 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

  • 可以通过gesture、priorityGesture和parallelGesture给组件绑定手势识别,手势识别成功后可以通过事件回调通知组件。可以通过触摸热区指定可识别手势的区域。gesture、priorityGesture和parallelGesture当前不支持使用三目运算符(条件? 表达式1 : 表达式2)切换手势绑定。

gesture

gesture(gesture: GestureType, mask?: GestureMask): T

绑定手势。

说明:

该接口不支持在attributeModifier中调用。

原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
gesture GestureType 绑定的手势类型。
mask GestureMask 事件响应设置。
默认值:GestureMask.Normal

返回值:

类型 说明
T 返回当前组件。

priorityGesture

priorityGesture(gesture: GestureType, mask?: GestureMask): T

绑定优先识别手势。

  1. 默认情况下,子组件优先识别通过gesture绑定的手势,当父组件配置priorityGesture时,父组件优先识别priorityGesture绑定的手势。

  2. 绑定长按手势时,设置触发长按的最短时间小的组件会优先响应,会忽略priorityGesture设置。

说明:

该接口不支持在attributeModifier中调用。

原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
gesture GestureType 绑定的手势对象。
mask GestureMask 事件响应设置。
默认值:GestureMask.Normal

返回值:

类型 说明
T 返回当前组件。

parallelGesture

parallelGesture(gesture: GestureType, mask?: GestureMask): T

绑定可与子组件手势同时触发的手势。手势事件为非冒泡事件。父组件设置parallelGesture时,父子组件相同的手势事件都可以触发,实现类似冒泡效果。

说明:

该接口不支持在attributeModifier中调用。

原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.ArkUI.ArkUI.Full

参数:

参数名 类型 必填 说明
gesture GestureType 绑定的手势对象。
mask GestureMask 事件响应设置。
默认值:GestureMask.Normal

返回值:

类型 说明
T 返回当前组件。

SourceType枚举说明8+

定义输入源对应的设备类型。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 说明
Unknown 0 未知输入源。
原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。
Mouse 1 鼠标。
原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。
TouchScreen 2 触摸屏。
原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。
KEY22+ 4 按键。
原子化服务API: 从API version 22开始,该接口支持在原子化服务中使用。
模型约束: 此接口仅可在Stage模型下使用。
JOYSTICK22+ 5 手柄。
原子化服务API: 从API version 22开始,该接口支持在原子化服务中使用。
模型约束: 此接口仅可在Stage模型下使用。

SourceTool枚举说明9+

定义输入源对应的工具类型。

系统能力: SystemCapability.ArkUI.ArkUI.Full

名称 说明
Unknown 0 未知输入源。
原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。
Finger 1 手指输入。
原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。
Pen 2 手写笔输入。
原子化服务API: 从API version 11开始,该接口支持在原子化服务中使用。
MOUSE12+ 7 鼠标输入。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。
模型约束: 此接口仅可在Stage模型下使用。
TOUCHPAD12+ 9 触控板输入。触控板单指输入被视为鼠标输入操作。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。
模型约束: 此接口仅可在Stage模型下使用。
JOYSTICK12+ 10 手柄输入。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。
模型约束: 此接口仅可在Stage模型下使用。

示例

示例1(父组件优先识别手势和父子组件同时触发手势)

该示例通过配置priorityGesture和parallelGesture分别实现了父组件优先识别手势和父子组件同时触发手势。

// xxx.ets
@Entry
@Component
struct GestureSettingsExample {
  @State priorityTestValue: string = ''
  @State parallelTestValue: string = ''

  build() {
    Column() {
      Column() {
        Text('TapGesture:' + this.priorityTestValue).fontSize(28)
          .gesture(
            TapGesture()
              .onAction((event: GestureEvent) => {
                this.priorityTestValue += '\nText'
              }))
      }
      .height(200)
      .width(250)
      .padding(20)
      .margin(20)
      .border({ width: 3 })
      // 设置为priorityGesture时,点击文本会忽略Text组件的TapGesture手势事件,优先识别父组件Column的TapGesture手势事件
      .priorityGesture(
        TapGesture()
          .onAction((event: GestureEvent) => {
            this.priorityTestValue += '\nColumn'
          }), GestureMask.IgnoreInternal)

      Column() {
        Text('TapGesture:' + this.parallelTestValue).fontSize(28)
          .gesture(
            TapGesture()
              .onAction((event: GestureEvent) => {
                this.parallelTestValue += '\nText'
              }))
      }
      .height(200)
      .width(250)
      .padding(20)
      .margin(20)
      .border({ width: 3 })
      // 设置为parallelGesture时,点击文本会同时触发子组件Text与父组件Column的TapGesture手势事件
      .parallelGesture(
        TapGesture()
          .onAction((event: GestureEvent) => {
            this.parallelTestValue += '\nColumn'
          }), GestureMask.Normal)
    }
  }
}

zh-cn_image_0000001210195016

示例2(实时监测参与滑动手势的有效触点数量)

该示例通过配置fingerInfos实时监测参与滑动手势的有效触点数量。

// xxx.ets
@Entry
@Component
struct PanGestureWithFingerCount {
  @State offsetX: number = 0
  @State offsetY: number = 0
  @State positionX: number = 0
  @State positionY: number = 0
  @State fingerCount: number = 0 // 用于记录参与手势的触点数量
  private panOption: PanGestureOptions = new PanGestureOptions({
    direction: PanDirection.All,
    fingers: 1
  })

  build() {
    Column() {
      // 显示当前有效触点数量
      Text(`触点数量: ${this.fingerCount}`)
        .fontSize(20)
        .margin(10)

      Column() {
        Text('PanGesture offset:\nX: ' + this.offsetX + '\n' + 'Y: ' + this.offsetY)
      }
      .height(200)
      .width(300)
      .padding(20)
      .border({ width: 3 })
      .margin(50)
      .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
      .gesture(
        PanGesture(this.panOption)
          .onActionStart((event: GestureEvent) => {
            console.info('Pan start')
            this.fingerCount = event.fingerInfos?.length || 0 // 记录触点数量
          })
          .onActionUpdate((event: GestureEvent) => {
            if (event) {
              console.info(`fingerInfos ${JSON.stringify(event.fingerInfos)}`)
              this.offsetX = this.positionX + event.offsetX
              this.offsetY = this.positionY + event.offsetY
              this.fingerCount = event.fingerInfos?.length || 0 // 更新触点数量,记录下参与当前手势的有效触点的数量
            }
          })
          .onActionEnd((event: GestureEvent) => {
            this.positionX = this.offsetX
            this.positionY = this.offsetY
            this.fingerCount = 0 // 触点离开触摸区域后归零
            console.info('Pan end')
          })
          .onActionCancel(() => {
            this.fingerCount = 0 // 手势取消后归零
          })
      )

      Button('切换为双指滑动')
        .onClick(() => {
          this.panOption.setFingers(2)
        })
    }
  }
}

zh-cn_image_0000001210195017