10

数年経った今でも、mouseEnabled についてまだ理解していないことがあります。私はスプライトを持っています (たとえば、ここでは "Sky" で、多くのオブジェクトが含まれています。そのうちの 1 つは、マウス イベントを受け取りたくない雲です。この空を他の表示オブジェクトに重ねます。雲を見えますが、マウス イベントをブロックしません。雲の切れ間から木が見える場合は、その木をクリックできるはずです。

スカイクラスでは:

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 に答える