0

私は最近、as3 のカスタム イベントで多くの問題を抱えています。役に立たない多くのものをグーグル検索し、このチュートリアルを使用してそれらを理解しようとしましたが、まだ混乱しています。

だから私はそれらをテストするために新しいフラッシュ fla ファイルを設定しましたが、それを理解できませんでした。ここに私が持っているものがあります:

ファイルとしてのドキュメント:

package  

{
import flash.events.MouseEvent;
import flash.display.MovieClip;

public class Custom extends MovieClip 
{
    var intializer:Initializer;

    var added:Added;

    public function Custom() 
    {
        intializer=new Initializer();
        addChild(intializer);
        intializer.addEventListener(MouseEvent.CLICK, OnClicker);
        addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch);
    }

    private function OnClicker(event:MouseEvent):void
    {
        added=new Added();
        added.x=300; added.y=300; 
        addChild(added);
    }

    private function OnCatch(event:CustomEvent):void
    {
        trace("hi");
        removeChild(added);
    }
}

}

ファイルとしてのイベント:

package  
{
    import flash.events.Event;

    public class CustomEvent extends Event
    {
        public static const EVENT_CUSTOM="event1";

        public function CustomEvent(type) 
        {
            super(type, false, false);
        }

    }

}

およびファイルとしてのムービークリップ:

package  
{
    import flash.events.MouseEvent;
    import flash.display.MovieClip;

    public class Added extends MovieClip 
    {
        var addedButton:AddedButton;

        public function Added() 
        {
            addedButton=new AddedButton();
            addedButton.x=30; addedButton.y=30;
            addChild(addedButton);
            addedButton.addEventListener(MouseEvent.CLICK, OnClickie);
        }

        private function OnClickie(event:MouseEvent):void
        {
            dispatchEvent(new CustomEvent(CustomEvent.EVENT_CUSTOM));
        }
    }

}

ボタンは空のクラスを使用します。これにより、次の結果が得られます: (最初のボタンの左上隅) http://www.fastswf.com/_EfGSoQ

非常に多くのコードで申し訳ありませんが、カスタム イベントには多くのコードが必要なようです。

4

1 に答える 1

3

問題は、カスタム イベントを間違った場所でリッスンしていることにあるようです。これには、イベント バブリング、イベントのキャプチャ フェーズを使用する方法、またはイベントをディスパッチするオブジェクト (イベント ターゲット) でイベントをリッスンする方法がいくつかあります。

Flash イベント モデルは、W3C イベント モデル (DOM/Javascript で使用) に従います。イベントがディスパッチされると、キャプチャ フェーズ、ターゲット フェーズ、バブリング フェーズの 3 つのフェーズを経ます。上記のリンク(「イベントの伝播とフェーズ」セクション)で説明されています。

パフォーマンス上の理由から (私の推測では)、キャプチャ フェーズとバブリング フェーズはデフォルトでは有効になっていません。

以下の 3 つのうちの 1 つだけを実行する必要があることに注意してください。イベント ターゲットを使用することをお勧めします。これが最も簡単です。他のものにはそれぞれの場所があり、非常に便利ですが、ターゲットフェーズでほとんどすべてを行うことができます.

ターゲットフェーズの使い方

ドキュメント クラスで、コンストラクターから次の行を削除します。

addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch);

オブジェクトから直接発生するイベントをリッスンするため、これを削除しAddedます (イベント ターゲットです)。そのためには、ドキュメント クラスにオブジェクトを追加するコードを次のように変更します。

private function OnClicker(event:MouseEvent):void
{
    added=new Added();
    added.x=300; added.y=300; 
    addChild(added);
    added.addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch);
}

キャプチャフェーズの使い方

ドキュメント クラスで、イベント リスナーを追加するときにパラメータを追加して、キャプチャ フェーズを有効にします。

addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch, true);

これにより、ターゲットがイベントを処理する前に、イベント ターゲットの任意の親がイベントを処理できるようになります。

バブリング フェーズの使用方法:

バブリング フェーズを使用するには、カスタム イベント オブジェクトを「バブリング」する必要があります。そのため、カスタム イベント クラスのコンストラクターを変更する必要があります。

public function CustomEvent(type) 
{
    super(type, true, false);
}

ここでは、呼び出しの 2 番目のパラメーターを に変更してsuper()、イベントが「バブル」できるようにしています。

イベントが表示リストをバックアップするようになったため、イベント ターゲットの親は、ターゲットがイベントを処理した後にイベントをリッスンすることもできます。

于 2013-08-25T20:04:26.380 に答える