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



需求:当多个手指触摸的时候,抬起任何的手指都不会结束屏幕上的其它触摸事件,只结束抬起手指的事件。
更多关于HarmonyOS 鸿蒙Next中多手指触摸事件,当第二个手指事件结束,会把所有的触摸事件结束的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者你好,我本地使用下面的代码没有复现出来您描述的现象:第二个手指事件结束,会把所有的触摸事件结束,我本地使用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事件,但不会终止其他手指的触摸事件。您遇到的问题可能是由于触摸事件处理逻辑不当导致的。
建议检查以下方面:
- 确保在onTouchEvent回调中正确处理ACTION_POINTER_UP事件,避免错误地调用cancel或reset操作。
- 使用getActionMasked()和getActionIndex()准确识别具体手指的事件,例如:
int action = event.getActionMasked(); int index = event.getActionIndex(); if (action == MotionEvent.ACTION_POINTER_UP) { // 仅处理抬起的手指,不干扰其他手指 } - 避免在事件处理中全局重置触摸状态,确保每个手指的触摸轨迹独立管理。
通过细化事件分发逻辑,可以实现在多指操作中仅结束特定手指的触摸事件,而保持其他手指的触摸状态。

