HarmonyOS 鸿蒙Next中多手指触摸事件,当第二个手指事件结束,会把所有的触摸事件结束

HarmonyOS 鸿蒙Next中多手指触摸事件,当第二个手指事件结束,会把所有的触摸事件结束 问题:1.当有一个手指按下左或右移动的时候,第二个手指无论点击那里当抬起第二个手指的时候,会把所有的手指监听事件结束。

cke_1829.png

cke_2526.png

cke_3436.png

需求:当多个手指触摸的时候,抬起任何的手指都不会结束屏幕上的其它触摸事件,只结束抬起手指的事件。


更多关于HarmonyOS 鸿蒙Next中多手指触摸事件,当第二个手指事件结束,会把所有的触摸事件结束的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

开发者你好,我本地使用下面的代码没有复现出来您描述的现象:第二个手指事件结束,会把所有的触摸事件结束,我本地使用DevEco Studio 6.0.0.858和6.0.0.100的测试手机,代码如下:

@Entry
@Component
struct TouchExample {
  @State text1: string = ''
  @State eventType1: string = ''
  @State text2: string = ''
  @State eventType2: string = ''
  @State text3: string = ''
  @State eventType3: string = ''

  build() {
    Column() {
      Button('Touch1').height(50).width(200).margin(20)
        .onTouch((event?: TouchEvent) => {
          if (event) {
            let info = JSON.stringify(event.touches)
            console.info(`${event.touches.length}`, info)
            if (event.type === TouchType.Down) {
              this.eventType1 = 'Down'
            }
            if (event.type === TouchType.Up) {
              this.eventType1 = 'Up'
            }
            if (event.type === TouchType.Move) {
              this.eventType1 = 'Move'
            }
            this.text1 = 'TouchType:' + this.eventType1 + '\nDistance between touch point and touch element:\nx: '
              + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
              + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
              + event.target.area.width + '\nheight:' + event.target.area.height
          }
        })
      Button('Touch2').height(50).width(200).margin(20)
        .onTouch((event?: TouchEvent) => {
          if (event) {
            let info = JSON.stringify(event.touches)
            console.info(`${event.touches.length}`, info)
            if (event.type === TouchType.Down) {
              this.eventType2 = 'Down'
            }
            if (event.type === TouchType.Up) {
              this.eventType2 = 'Up'
            }
            if (event.type === TouchType.Move) {
              this.eventType2 = 'Move'
            }
            this.text2 = 'TouchType:' + this.eventType2 + '\nDistance between touch point and touch element:\nx: '
              + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
              + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
              + event.target.area.width + '\nheight:' + event.target.area.height
          }
        })
      Button('Touch3').height(50).width(200).margin(20)
        .onTouch((event?: TouchEvent) => {
          if (event) {
            let info = JSON.stringify(event.touches)
            console.info(`${event.touches.length}`, info)
            if (event.type === TouchType.Down) {
              this.eventType3 = 'Down'
            }
            if (event.type === TouchType.Up) {
              this.eventType3 = 'Up'
            }
            if (event.type === TouchType.Move) {
              this.eventType3 = 'Move'
            }
            this.text3 = 'TouchType:' + this.eventType3 + '\nDistance between touch point and touch element:\nx: '
              + event.touches[0].x + '\n' + 'y: ' + event.touches[0].y + '\nComponent globalPos:('
              + event.target.area.globalPosition.x + ',' + event.target.area.globalPosition.y + ')\nwidth:'
              + event.target.area.width + '\nheight:' + event.target.area.height
          }
        })
      Text(this.text1)
      Text(this.text2)
      Text(this.text3)
    }.width('100%').padding(30)
  }
}

开发者也可以试下这个代码是否可以复现您描述的问题,若是不能解决您的问题,请提供以下信息:

1.复现代码(如最小复现demo),针对您的这个问题,是否可以提供一下再完整一点的代码demo;

2.版本信息(如:开发工具、手机系统版本信息);

更多关于HarmonyOS 鸿蒙Next中多手指触摸事件,当第二个手指事件结束,会把所有的触摸事件结束的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你遇到的问题是 “没有按「手指唯一标识(touchId)」区分触摸事件” —— 鸿蒙中每个手指触摸都会分配唯一的 touchId,但你可能在处理 up 事件时,直接终止了整个触摸监听(比如清空了所有状态、停止了移动事件响应),而非仅移除 “抬起的那个手指” 的状态。

简单说:所有手指的事件是通过 touchId 区分的,必须按 touchId 单独维护每个手指的生命周期,不能 “一荣俱荣、一损俱损”。

核心解决思路:touchId 单独维护每个手指的生命周期,不使用 “全局开关”(如单个布尔值)控制所有触摸事件,仅在对应手指的 up/cancel 事件中删除该手指的状态,从而实现 “抬起一个手指不影响其他手指” 的需求。

在HarmonyOS鸿蒙Next中,多手指触摸事件处理机制存在特定行为:当第二个手指触摸事件结束时,系统可能触发所有触摸事件终止。这源于鸿蒙的触摸事件分发逻辑,事件被统一管理,某一手指的结束可能被识别为整体交互中断。开发者需注意事件回调中的多点触控标识,通过检查触摸点状态(如ACTION_POINTER_UP)来区分单指与多指操作,避免意外事件终止。具体实现应参考鸿蒙官方输入事件API文档。

在HarmonyOS Next中,多指触摸事件默认遵循标准触摸事件处理机制,即当任一手指抬起时,系统会发送ACTION_POINTER_UP事件,但不会终止其他手指的触摸事件。您遇到的问题可能是由于触摸事件处理逻辑不当导致的。

建议检查以下方面:

  1. 确保在onTouchEvent回调中正确处理ACTION_POINTER_UP事件,避免错误地调用cancel或reset操作。
  2. 使用getActionMasked()和getActionIndex()准确识别具体手指的事件,例如:
    int action = event.getActionMasked();
    int index = event.getActionIndex();
    if (action == MotionEvent.ACTION_POINTER_UP) {
        // 仅处理抬起的手指,不干扰其他手指
    }
    
  3. 避免在事件处理中全局重置触摸状态,确保每个手指的触摸轨迹独立管理。

通过细化事件分发逻辑,可以实现在多指操作中仅结束特定手指的触摸事件,而保持其他手指的触摸状态。

回到顶部