HarmonyOS 鸿蒙Next多个手势冲突问题
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
可以把单机和长按的手势设为互斥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系统中,手势冲突通常是由于系统或应用识别了多个可能的手势输入,导致执行了非预期的操作。这类问题可能源于手势设计的重叠或系统对手势识别的误判。
解决手势冲突,首先需要确认具体的手势冲突场景,例如是在使用特定应用时还是系统级操作中。然后,可以尝试以下方法:
-
更新系统:确保你的鸿蒙系统已更新到最新版本,因为新版本可能修复了已知的手势冲突问题。
-
应用更新:如果冲突发生在特定应用中,检查该应用是否有更新版本,因为开发者可能已经针对手势冲突进行了优化。
-
自定义手势:部分鸿蒙设备允许用户自定义手势,尝试调整或禁用冲突的手势设置,以避免误触。
-
重启设备:有时简单的重启可以清除临时故障,解决手势冲突问题。
如果以上方法均未能解决问题,可能是系统或应用的深层次问题,需要更专业的技术支持。此时,请联系官网客服获取进一步的帮助。官网地址是: https://www.itying.com/category-93-b0.html