HarmonyOS 鸿蒙Next多个手势冲突问题

发布于 1周前 作者 ionicwang 来自 鸿蒙OS

HarmonyOS 鸿蒙Next多个手势冲突问题

我现在要给一个组件添加单击、长按、拖动3种手势,但是如果设置GestureMode.Sequence时,就不走单击事件,如果把单击事件放在前边又不走长按事件,如果设置为GestureMode.Parallel的话,长按也会走单击,我得需求是当用户单击就走TapGesture回调,当用户长按就走LongPressGesture回调,当用户手势移动就走PanGesture回调,以下我目前的代码,请问一下要怎么处理这个手势:

gesture(GestureGroup(GestureMode.Sequence,
  GestureGroup(GestureMode.Sequence, LongPressGesture()
    .onAction(event => {
      this.isLong = true
      LoggerUtils.error(`LongPressGesture------------------onAction`)
      if (event) {
        this.recordData.startRecordAction(false)
      }
    }).onActionEnd(event => {
      LoggerUtils.error(`LongPressGesture------------------onActionEnd`)
      this.isLong = false
      if (this.recordData.unableChangeValue()) {
        return
      }
      clearInterval(0);
      const offsetY = event.offsetY;
      let cancelAction: boolean = offsetY <= -10
      this.recordData.stopRecordAction(cancelAction)
    }), PanGesture({ direction: PanDirection.Left | PanDirection.Right | PanDirection.Up, distance: 50 })
    .onActionEnd(event => {
      LoggerUtils.error(`PanGesture------------------onActionEnd`)
      clearInterval(0)
      const offsetY = event.offsetY;
      let cancelAction: boolean = offsetY <= -10
      this.recordData.stopRecordAction(cancelAction);
    }),).onCancel(() => {
    this.isLong = false
    LoggerUtils.error(`GestureGroup------------------onCancel`)
    if (this.recordData.unableChangeValue()) {
      return
    }
    clearInterval(0);
    this.recordData.stopRecordAction(false)
  }), TapGesture()
    .onAction(event => {
      LoggerUtils.error(`TapGesture------------------onAction`)
      if (event &&
        !this.isLong) {
        //点击录音模式 激活长按开始触发,点击录音开始后 禁用长按 
        if (this.recordDelayV > 0 || this.recordData.showTapHandleButton(this.recordOnPressed)) {
          return
        }
        if (this.recordData.supportTapRecordValue) {
          this.recordData.tapRecord()
        }
      }
    }),

更多关于HarmonyOS 鸿蒙Next多个手势冲突问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

可以把单机和长按的手势设为互斥Exclusive

// xxx.ets

@Entry
@Component
struct GestureGroupExample {

  @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

  build() {
    Column() {
      Text('sequence gesture\n' + 'LongPress onAction:' + this.count + '\nPanGesture offset:\nX: ' + this.offsetX + '\nY: ' + this.offsetY)
        .fontSize(15)
    }
    .translate({ x: this.offsetX, y: this.offsetY, z: 0 })
    .height(150)
    .width(200)
    .padding(20)
    .margin(20)
    .border({ width: 3, style: this.borderStyles })
    .gesture(
      GestureGroup(GestureMode.Exclusive,
        // 以下组合手势为顺序识别,当长按手势事件未正常触发时则不会触发拖动手势事件
        GestureGroup(GestureMode.Sequence,
          LongPressGesture({ repeat: true })
            .onAction((event?: GestureEvent) => {
              if (event && event.repeat) {
                this.count++
              }
              console.info('sequence LongPress onAction')
            }),
          PanGesture()
            .onActionStart(() => {
              this.borderStyles = BorderStyle.Dashed
              console.info('pan start')
            })
            .onActionUpdate((event?: GestureEvent) => {
              if (event) {
                this.offsetX = this.positionX + event.offsetX
                this.offsetY = this.positionY + event.offsetY
              }
              console.info('sequence pan update')
            })
            .onActionEnd(() => {
              this.positionX = this.offsetX
              this.positionY = this.offsetY
              this.borderStyles = BorderStyle.Solid
              console.info('sequence pan end')
            })
            .onCancel(() => {
              console.info('sequence gesture canceled')
            }),
          TapGesture()
            .onAction((event: GestureEvent) => {
              console.info('sequence  TapGesture')
            })
        )
        .onCancel(() => {
          console.info('sequence gesture canceled')
        })
      )
    )
  }
}

这个逻辑是否能放在长按的onActionEnd和滑动的onActionEnd中呢

或者给onCancel中加上判断

更多关于HarmonyOS 鸿蒙Next多个手势冲突问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


GestureGroup 中有针对组合的方式,进行不同交互的逻辑,GestureMode 点击可以设置组合手势识别模式。

针对HarmonyOS 鸿蒙Next多个手势冲突问题,以下是专业回答:

HarmonyOS 鸿蒙Next系统中,手势冲突通常是由于系统或应用识别了多个可能的手势输入,导致执行了非预期的操作。这类问题可能源于手势设计的重叠或系统对手势识别的误判。

解决手势冲突,首先需要确认具体的手势冲突场景,例如是在使用特定应用时还是系统级操作中。然后,可以尝试以下方法:

  1. 更新系统:确保你的鸿蒙系统已更新到最新版本,因为新版本可能修复了已知的手势冲突问题。

  2. 应用更新:如果冲突发生在特定应用中,检查该应用是否有更新版本,因为开发者可能已经针对手势冲突进行了优化。

  3. 自定义手势:部分鸿蒙设备允许用户自定义手势,尝试调整或禁用冲突的手势设置,以避免误触。

  4. 重启设备:有时简单的重启可以清除临时故障,解决手势冲突问题。

如果以上方法均未能解决问题,可能是系统或应用的深层次问题,需要更专业的技术支持。此时,请联系官网客服获取进一步的帮助。官网地址是: https://www.itying.com/category-93-b0.html

回到顶部