ArkUI - 事件分发控制

307 阅读2分钟

安卓程序员对ArkUI的事件分发机制应该会感到困惑,为什么我只是在Stack里放了两个元素,并没有定制任何onTouch或者onClick行为,所有手势就会被最上层的元素拦截下来。对于这个表现,鸿蒙官方文档给出了提醒:

  • 当Stack组件中有多个节点触摸区域重叠时,如两个节点,默认只会对显示在最上层的节点做触摸测试,若需要显示在下层的节点触发触摸测试,请给显示在上层的节点设置hitTestBehavior为HitTestMode.Transparent。

说明官方也知道这个地方是个坑。。。 那就来了解下他设计的这个事件分发控制吧,他暴露了一个接口,也就是组件的hitTestBehavior属性,看下不同取值的含义:

名称枚举值描述
Default0默认触摸测试效果,自身和子节点都响应触摸测试,但会阻塞兄弟节点的触摸测试。
Block1自身响应触摸测试,阻塞子节点和兄弟节点的触摸测试。
Transparent2自身和子节点都响应触摸测试,不会阻塞兄弟节点的触摸测试。
None3自身不响应触摸测试,不会阻塞子节点和兄弟节点的触摸测试。

我们注意到组件的onClick和onTouch都是没有返回值的,也就是他不像安卓依赖每个组件去判断是否需要拦截事件,而是在一开始就决定分发行为。 可以看到,在默认值的情况下,Stack中上层的元素会把事件拦截下来。因此我们这里可以通过设置为Transparent或者None不阻塞兄弟节点的事件。

唉,他这个设计吧,你说把Stack的默认值设成None好像也不合适,怎么看怎么别扭。 此外官方还提供了自定义事件分发和事件独占能力(未完待续)