【问题标题】:as3 mouseEnabled still a problem for meas3 mouseEnabled 对我来说仍然是个问题
【发布时间】:2010-02-11 22:47:50
【问题描述】:

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

在天空类中:

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

即使使用此配置,当云在树上方时,我也无法单击树,因为云挡住了它。为什么???

【问题讨论】:

    标签: actionscript-3 mouseevent displayobject


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我在文本字段方面遇到了类似的问题,它位于一个与按钮共享共同祖先的容器中。在没有直接引用容器的情况下,我能够调用父级并将 mouseEnabled/Children 设置为 false。
    【解决方案2】:

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

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

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

    【讨论】:

    • 好的,忘记“许多对象”部分。只有一个我想要禁用的对象,以及一个我想要启用的对象。启用的对象非常小,不会影响这一点。这是我使用您发布的代码时得到的结果:instance5 flash.display::Sprite
    • 好的,所以那里有一个没有实例名称的精灵,它正在接收点击而不是云。你的树有实例名称吗?我会给你的剪辑名称,这样你就可以确定哪个剪辑实际上是阻塞的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多