HarmonyOS 鸿蒙Next中swipeAction 无法响应点击事件

HarmonyOS 鸿蒙Next中swipeAction 无法响应点击事件 cke_430.png

cke_1141.png

这里点击事件不响应,项目API17,加了offset之后无法响应点击事件


更多关于HarmonyOS 鸿蒙Next中swipeAction 无法响应点击事件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

你看下这个方案行不行,能不能解决你的问题:

【背景知识】 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属性后点击事件无法响应,可能是因为手势冲突或事件传递被阻断。

建议检查以下两点:

  1. 确认是否在SwipeAction内嵌套了可点击组件(如Button),并确保这些组件没有设置阻止事件冒泡的属性。
  2. 尝试使用onClick事件处理替代子组件的点击监听,或者通过调整SwipeAction的滑动阈值(如通过自定义手势识别)来避免误拦截。

如果问题仍然存在,可能需要进一步检查布局结构或事件处理逻辑是否有冲突。

回到顶部