10

几年后,我仍然没有得到关于 mouseEnabled 的一些东西。我有一个精灵(例如这里的“天空”,它包含许多对象,其中一个是云,我不想接收鼠标事件。我将这个天空覆盖在其他一些显示对象上。我希望云是可见,但不阻止鼠标事件。如果你看到一棵穿过云层的树,你应该能够点击树。

在天空类中:

mouseEnabled = false;
cloud.mouseEnabled = false;
cloud.mouseChildren = false;

即使使用此配置,当云在树上时,我也无法单击树,因为云会阻止它。为什么???

4

2 回答 2

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 的子项接收点击事件 :)

于 2010-04-21T20:58:29.230 回答
4

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

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

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

于 2010-02-11T22:53:33.690 回答