一个被触摸层级搞蒙了的小白

想要得到的效果:当点击蓝色面板时,红色区域LoginView不会触发触摸事件(点击红色区域会关闭该弹窗,不应该点击蓝色区域还触发红色区域的触摸将弹窗关闭,体验不好)。

LoginView本身是Node,将node设置了区域this.node.setContentSize(winSize.width, winSize.height) 并且添加了TOUCH监听,然后还添加了一个label组件。看效果图,说明红色箭头指向的区域层级是在蓝色指向的区域层级下方。按道理点击蓝色箭头指向的区域是不会触发红色区域的触摸,但是通过代码打印,穿透过去了!!!

然后我在绿色箭头指向的pop_title图片上添加TOUCH,发现蓝色指向的区域触摸未响应,但是红色指向的区域触摸会响应。

是因为LoginView是根节点吗?

参考BlockInputEvents代码,试试把event的propagationStopped设为true

function stopPropagation(event: Event) {
event.propagationStopped = true;
}

const BlockEvents = [SystemEventType.TOUCH_START, SystemEventType.TOUCH_END, SystemEventType.TOUCH_MOVE,
SystemEventType.MOUSE_DOWN, SystemEventType.MOUSE_MOVE, SystemEventType.MOUSE_UP,
SystemEventType.MOUSE_ENTER, SystemEventType.MOUSE_LEAVE, SystemEventType.MOUSE_WHEEL];

this.node.on(BlockEvents[i], stopPropagation, this);

其实即使LoginView不穿透还是不行,点击外部区域还是能点击到底部的按钮之类的响应触摸的节点。
要在LoginView底部放一个占满屏幕的节点,这个节点监听触摸事件,然后用cc.rect.contains判断是否点中LoginView,如果返回false则关闭LoginView窗口