2009-05-29 2 views
1

私はステージが聴きたいと思うカスタムムーブイベントをディスパッチする、いくつかのムービークリップ内で開催される一連のムービークリップを持っています。イベントのリスナーをステージ(または任意のオブジェクト)に追加する方法はありますか?グローバルイベントのためのフラッシュイベントリスナー

たとえば、子から、またはその子のいずれか、またはその子の子から送出されたEVENT.COMPLETEをリッスンするイベントリスナーをステージに追加できますか?

答えて

6

あなたが探しているのは、イベントのバブリングです。バブリングを有効にするには、新しいイベントの3番目のプロパティをtrueに設定し、イベントをステージにディスパッチするオブジェクトから開始して、表示リストをバブルアップします。詳細については、公式ドキュメントを参照してください。

タイラー。

編集:人々は常にステージ上のイベントをキャプチャするためにバブリングイベントを使用する理由「段階から」変更はまあ

+0

パーフェクト!私はいつも "泡立つ"という言葉に遭遇しましたが、それが何を指しているのか理解できませんでした。 +1 –

2

を「オブジェクトがイベントをディスパッチする」、これが...私は理解することは決してないだろう何かありますか?

ドックを見ると、ステージからターゲットオブジェクトにイベントが伝播し(キャプチャフェーズ)、バブルを有効にするとバブルが発生します。

そう...ちょうどキャプチャを使用します。

Main.as 

package { 
    import flash.display.Sprite; 

    public class Main extends Sprite 
    { 
     public function Main() 
     { 
      var c:Circle = new Circle(); 
      var r:Rect = new Rect(); 
      c.addChild(r); 
      addChild(c); 
      addEventListener(CustomEvent.CUSTOM, customEventHandler, true);//don't forget third parameter to use capture 
     } 

     private function customEventHandler(e:CustomEvent):void 
     { 
      trace(e.eventPhase == EventPhase.CAPTURING_PHASE);//shows true 
     } 
    } 
} 

Circle.as 

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 

    public class Circle extends Sprite 
    { 
     public function Circle() 
     { 
      super(); 
      init(); 
     } 

     private function init():void 
     { 
      with(graphics) 
      { 
       beginFill(0xFF0000); 
       drawCircle(25, 25, 50); 
       endFill() 
      } 

     } 
    } 
} 

Rect.as 

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

    public class Rect extends Sprite 
    { 
     public function Rect() 
     { 
      super(); 
      init(); 
     } 

     private function init():void 
     { 
      with(graphics) 
      { 
       beginFill(0x000000); 
       drawRect(0, 0, 25, 25); 
       endFill(); 
      } 

      addEventListener(MouseEvent.CLICK, mouseClickHandler); 
     } 

     private function mouseClickHandler(e:MouseEvent):void 
     { 
      dispatchEvent(new CustomEvent(CustomEvent.CUSTOM)); 
     } 


    } 
} 

CustomEvent.as

package 
{ 
    import flash.events.Event; 

    public class CustomEvent extends Event 
    { 
     public static const CUSTOM:String = "custom"; 

     public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) 
     { 
      super(type, bubbles, cancelable); 
     } 

    } 
} 
+0

こんにちはPeZ、これは多くの場合、特にマウスイベントでは絶対に正しいです。しかし、ポスターで説明されている状況では、バブリングを真に設定する必要があります。これは、手動イベントディスパッチ、この場合のEvent.COMPLETEがステージではなく子クリップから開始しているため、発生する実際のキャプチャフェーズが存在しないためです。 –

+0

タイラー、 あなたの声明は間違っていると思います。 イベントをディスパッチするオブジェクトがステージ上にある限り、それが手動イベントディスパッチであってもキャプチャフェーズが存在します。 私の例を見てください。これは手動イベントディスパッチです。私のカスタムイベントでバブリングがfalseに設定されています。 –

+0

PeZ、あなたのCustomEventはどんなタイプのイベントになりますか? MouseEventsのバブルはデフォルトで、イベントは無効です。これをあなたのCustomEventハンドラに追加して、その内容を確認できますか?みんなのためにこれを明確にするのを助けるという性質の中で。 トレース(e.eventPhase == EventPhase.CAPTURING_PHASE); –