4

明けましておめでとうございます!

コンテナとその子からイベント処理を分離したい。ご覧のとおり、私のソース コードは非常に単純です。

    package  {
    import flash.display.Sprite;
    import flash.display.*;
    import flash.events.*;

    public class test extends Sprite{

        public function test() {
            var container:Sprite = new Sprite();  // my container
            container.graphics.beginFill(0, 1);  // whatever the color
            container.graphics.drawRect(0, 0, 100, 100); // origin at 0,0
            container.graphics.endFill();
            addChild(container);

            var decor:Sprite = new Sprite();  // and it child
            decor.graphics.beginFill(0, 1);  // whatever the color
            decor.graphics.drawRect(200, 200, 100, 100);  // origin at 200,200
            decor.graphics.endFill();
            container.addChild(decor);
            container.mouseChildren = false;
            container.addEventListener(MouseEvent.ROLL_OVER, onOver, false, 0, true);
        }
        private function onOver(e: MouseEvent):void {
            trace("ROLL trace");
        }
    }
}

コンテナー オブジェクトをロールオーバーすると、トレースが表示されます (私には問題ありません)。しかし、装飾オブジェクトをロールオーバーすると、トレースも取得されます(必要なものではありません)。コンテナを子ではなく、マウスイベントによってトリガーしたいだけです。それで、私の mouseChildren = false に何が起こったのでしょうか....? 理解できない...

4

2 に答える 2

4

decorオブジェクトは のメンバであるためcontainer、 内の他のコンテンツとともに評価されますcontainer

mouseChildren = false;マウス イベントを完全に無効にする方法ではなく、複合表示オブジェクト内の複雑さを軽減する方法です。マウス イベントは引き続き発生しますが、イベントのtargetプロパティには、マウスが実際にロールオーバーした子オブジェクトへの参照は含まれず、親オブジェクトへの参照のみが含まれます。プロパティが設定されたこと。

decor完全に無視したい場合は、decor.mouseEnabled = false;代わりに使用してください。

于 2012-01-03T01:41:29.803 に答える
1

mouseEnabled = false を試しましたが、どちらも機能していません。別のフォーラムで、 「コンテナ内の塗りつぶされたオブジェクトがイベント ハンドラーをトリガーする」とある人が私に言いました。したがって、彼の解決策は、コンテナを用意し、2 つの子を作成することです。1 つはマウス イベントを処理し、もう 1 つは装飾として使用します。

そして、それはかなりうまくいっています。

于 2012-01-03T08:28:27.970 に答える