HarmonyOS 鸿蒙Next中swipeAction 无法响应点击事件
HarmonyOS 鸿蒙Next中swipeAction 无法响应点击事件
这里点击事件不响应,项目API17,加了offset之后无法响应点击事件
更多关于HarmonyOS 鸿蒙Next中swipeAction 无法响应点击事件的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你看下这个方案行不行,能不能解决你的问题:
【背景知识】 ArkUI开发框架在处理触屏事件时,会在触屏事件触发前,进行按压点和组件区域的触摸测试来收集需要响应触屏事件的组件,然后基于触摸测试结果分发相应的触屏事件。hitTestBehavior属性可以设置不同的触摸测试响应模式,影响组件的触摸测试收集结果,最终影响后续的触屏事件分发,具体影响参考HitTestMode枚举说明。 【解决方案】 可以通过hitTestBehavior(HitTestMode.Block)属性来设置触摸测试响应模式。 参考代码:
@Entry
@Component
struct Index {
@State arr: number[] = [0, 1, 2, 3, 4]
@State enterEndDeleteAreaString: string = "not enterEndDeleteArea"
@State exitEndDeleteAreaString: string = "not exitEndDeleteArea"
private scroller: ListScroller = new ListScroller()
@State isEdit: boolean = true
@Builder
itemEnd() {
Row() {
Button("Delete").margin("4vp")
Button("Set").margin("4vp").onClick(() => {
console.log('lcs ---', 'set')
})
}.padding("4vp").justifyContent(FlexAlign.SpaceEvenly)
}
@Builder
listBuilder(item: number) {
Row() {
Text(item.toString())
Button('分享')
.hitTestBehavior(HitTestMode.Block) // 设置hitTestBehavior(HitTestMode.Block)响应onClick事件
.onClick(() => {
console.log('lcs ---', 'share')
})
Button('分享2')
.hitTestBehavior(HitTestMode.Block) // 设置hitTestBehavior(HitTestMode.Block)响应onClick事件
.onClick(() => {
console.log('lcs ---', 'share2')
})
}
.width('100%')
.backgroundColor(Color.White)
.padding({
top: 20,
bottom: 20,
left: 200
})
.margin({
bottom: 10,
})
}
build() {
Column() {
List({ scroller: this.scroller }) {
ForEach(this.arr, (item: number | null, index: number) => {
ListItem() {
if (item) {
this.listBuilder(item);
}
}
.transition({ type: TransitionType.All, opacity: 0 })
.swipeAction({
end: item && this.isEdit ? {
builder: () => {
this.itemEnd();
},
onAction: () => {
animateTo({ duration: 1000 }, () => {
})
},
actionAreaDistance: 0,
onEnterActionArea: () => {
this.enterEndDeleteAreaString = "enterEndDeleteArea"
this.exitEndDeleteAreaString = "not exitEndDeleteArea"
},
onExitActionArea: () => {
this.enterEndDeleteAreaString = "not enterEndDeleteArea"
this.exitEndDeleteAreaString = "exitEndDeleteArea"
}
} : null
})
.clip(true)
.onClick((e) => {
console.log('lcs ---', 'ListItem==onClick')
})
})
}
.edgeEffect(EdgeEffect.None)
.scrollBar(BarState.Off)
}
.padding(10)
.backgroundColor(0xDCDCDC)
.width('100%')
.height('100%')
}
}
更多关于HarmonyOS 鸿蒙Next中swipeAction 无法响应点击事件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
使用margin或padding替代offset,确保触摸区域与视觉位置一致
Text("Clickable Text")
.margin({ left: 10, top: 20 }) // 替代offset
.onClick(() => {
console.log("Clicked");
});
若必须使用offset,需同步调整组件尺寸,确保触摸区域覆盖偏移后的位置
Text("Clickable Text")
.offset({ x: 10, y: 20 })
.width(100) // 明确设置触摸区域宽度
.height(50) // 明确设置触摸区域高度
.onClick(() => {
console.log("Clicked");
});
第一点:为swipeAction添加offset参数,需确保偏移后的按钮位置仍处于可交互区域。若偏移量超出父容器范围或与其他布局冲突,会导致点击事件失效。建议你检查偏移量计算逻辑,并通过Debug模式确认按钮实际渲染位置。
第二点:若父容器或其他嵌套组件监听了相同类型的手势事件,可能会拦截事件传递。通过以下方式解决:
.swipeAction({
// 手势事件设置冒泡阻断
onGestureJudgeBegin: (gestureInfo: GestureInfo) => {
return GestureJudgeResult.BREAK
}
})
第三点:@Builder函数中的点击事件需显式绑定上下文:
[@Builder](/user/Builder)
itemEnd() {
Button('标记')
.onClick(() => {
this.changeStatus() // 确保通过箭头函数或bind绑定正确上下文
})
}
.swipeAction({ end: this.deleteButton(index) })
改为这样看看,不需要builder
在HarmonyOS鸿蒙Next中,swipeAction组件默认不支持点击事件响应。该组件主要用于滑动操作,如侧滑删除或菜单展开。点击事件通常由容器组件(如List或Grid)中的项目本身处理。若需同时支持滑动和点击,需在项目布局内嵌套可点击组件(如Button),并单独处理其点击逻辑。避免直接为swipeAction绑定点击事件。
在HarmonyOS Next中,SwipeAction组件默认会拦截子组件的点击事件,这是设计上的预期行为。如果添加了offset属性后点击事件无法响应,可能是因为手势冲突或事件传递被阻断。
建议检查以下两点:
- 确认是否在SwipeAction内嵌套了可点击组件(如Button),并确保这些组件没有设置阻止事件冒泡的属性。
- 尝试使用onClick事件处理替代子组件的点击监听,或者通过调整SwipeAction的滑动阈值(如通过自定义手势识别)来避免误拦截。
如果问题仍然存在,可能需要进一步检查布局结构或事件处理逻辑是否有冲突。