监听触摸事件的节点被隐藏后,触摸事件不在被回调

  • Creator 版本:2.3.3

  • 目标平台: Web

  • 详细报错信息,包含调用堆栈:

  • 重现方式:先点击一个节点(不要松手),在这个节点的TOUCH_START回调中设置一个定时器,2秒后隐藏该节点,然后等节点被隐藏后再松手,此时TOUCH_END和TOUCH_CANCEL都不会被调用。

  • 之前哪个版本是正常的 :

  • 手机型号 :

  • 手机浏览器 :

  • 编辑器操作系统 :

  • 编辑器之前是否有其它报错 :

  • 出现概率:

  • 额外线索:

目前节点事件的处理机制是这样的,在节点隐藏的时候,该节点所注册的 EventListener 会被暂停,后续的事件触发就不再处理了。你是什么样的使用场景,在节点隐藏之后还要再触发 TOUCH_END 和 TOUCH_CANCEL?

这里引擎犯了一个错误,也是我今天才提出来的。由于 Cocos2d-x 的历史原因,touchcancel 被实现为手指从按钮移出去后松开时触发,这是错误的。Creator 也继承了这个错误。导致正儿八经的节点被隐藏(或者被系统遮挡)时无法使用 touchcancel 事件。但是如果做出调整的话会面临很大的兼容性问题。之后我们再讨论讨论如何解决这个问题吧。

你这里可以先监听 onDisable 来模拟节点被隐藏时的事件吗?

1赞

是不是可以添加一个新的事件,响应节点隐藏,手指离开节点后触发,而旧的事件保留,作为兼容

使用场景:我在根节点上需要监听触摸事件,然后根节点下的子节点也需要监听触摸事件。但是子节点是可能会被回收到对象池中的。如果我触摸持续的过程中子节点的被回收,就会导致根节点收不到触摸结束的回调,这时候就会有问题。

onDisable是不可以的,因为要触发的时机就是触摸事件的结束,而不是子节点隐藏就触发。

现在的处理方法:
触摸事件由根节点监听,然后由根节点分发(根节点不会被隐藏),子节点如果需要监听触摸事件,就监听根节点分发的事件。但是这样需要子节点再自己判断一下点击位置是否在自己身上。

请问现在有方法可以解决吗?