as3 mouseEnabled对我来说仍然是一个问题

phi*_*hil 10 displayobject actionscript-3 mouseevent

现在几年,还有一些关于mouseEnabled的东西,我没有得到.我有一个Sprite(例如这里的"Sky",它包含许多对象,其中一个是Cloud,我不想接收鼠标事件.我将这个Sky叠加在其他一些显示对象上.我希望云是可见,但不能阻止鼠标事件.如果你看到一棵树穿过云,你应该可以点击树.

在天空班:

mouseEnabled = false;
cloud.mouseEnabled = false;
cloud.mouseChildren = false;
Run Code Online (Sandbox Code Playgroud)

即使使用这种配置,当云在树上时我也无法点击树,因为云会阻止它.为什么???

Tri*_*nko 28

即使Sky将mouseEnabled/mouseChildren设置为false ...它仍然是一个对象,它仍占用空间,因此仍然可以作为任何没有mouseEnabled/mouseChildren设置为false的PARENT容器的命中区域.

因此,我怀疑您的Sky对象与Tree对象不在同一个父容器中.您的Sky对象可能有自己的父容器对象,这是拦截事件的罪魁祸首.

详细说明:任何包含ANYTHING的对象都会有一个命中区域并拦截鼠标点击,即使它包含的所有单独内容(形状,子对象等)都可能将mouseEnabled/mouseChildren设置为false.

因此,即使您的Sky对象将mouseEnabled设置为false,您的Sky(及其子项)仍会占用空间,因此仍然会为Sky的父容器提供一个命中区域来拦截鼠标事件.

因此,您的解决方案是确保Sky的所有父容器都将mouseEnabled属性设置为false,至少达到(但不包括)Tree和Sky对象的第一个共同祖先容器.

此外,通过设置mouseEnabled = false并保留mouseChildren = true,您可以拥有一个容器,其中只有选择具有mouseEnabled = true的子项才能接收单击事件:)


typ*_*ror 4

你说里面有“很多东西”?很可能有其他东西阻碍了它。我建议在舞台上添加一个侦听器,然后您可以看到哪个对象正在接收点击:

import flash.utils.getQualifiedClassName;
stage.addEventListener(MouseEvent.CLICK, onClick);
private function onClick(event:MouseEvent):void
{
    trace(event.target.name, getQualifiedClassName(event.target));
}
Run Code Online (Sandbox Code Playgroud)

发布更多代码,我们可能可以提供更多帮助。