2009-05-29 6 views
1

여러 무비 클립에서 개최되는 일련의 MovieClip을 통해 무대에서 듣고 상호 작용할 수있는 사용자 정의 무비 클립을 전달합니다. 스테이지 (또는 Object)에 이벤트 유형에 관계없이 이벤트 리스너를 추가 할 수 있습니까?전역 이벤트를위한 플래시 이벤트 리스너

예를 들어, 자식, 또는 그 자식 중 하나 또는 자식 중 하나에서 전달 된 EVENT.COMPLETE을 수신 대기하는 이벤트 리스너를 스테이지에 추가 할 수 있습니까?

답변

6

찾고있는 것은 이벤트 버블 링입니다. 버블 링을 사용하려면 새 이벤트의 세 번째 속성을 true로 설정하고 이벤트를 스테이지로 전달하는 객체부터 시작하여 표시 목록을 버블 링합니다. 자세한 정보는 공식 문서를 참조하십시오.

타일러.

편집 : 변경을

+0

완벽한을 :

그래서 그냥 ... 캡처를 사용! 나는 항상 "버블 링 (Bubbling)"이라는 용어를 접하게되었지만, 그것이 무엇을 의미하는지 이해하지 못했습니다. +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, 이것은 마우스 이벤트와 함께 많은 경우에 절대적으로 정확합니다. 그러나 포스터에서 설명한 상황에서 버블 링을 true로 설정해야합니다. 이 경우 수동 이벤트 전달, Event.COMPLETE는 스테이지가 아닌 자식 클립에서 시작하므로 발생하는 실제 캡처 단계가 없기 때문입니다. –

+0

타일러, 귀하의 진술이 잘못되었다고 생각합니다. 이벤트를 전달하는 객체가 스테이지에있는 한 수동 이벤트 전달 인 경우에도 캡처 단계가 있습니다. 내 예제를 살펴 보겠습니다.이 이벤트는 수동 이벤트 전달이며 내 맞춤 이벤트에서는 버블 링이 false로 설정되어 있습니다. –

+0

PeZ, CustomEvent가 어떤 유형의 이벤트를 확장합니까? MouseEvents는 기본적으로 거품을 발생 시키지만 이벤트는 거품을 발생시키지 않습니다. 이 내용을 CustomEvent 핸들러에 추가하여 표시되는 내용을 확인할 수 있습니까? 모든 사람에게이를 명확히하는 데 도움이되는 성격입니다. 추적 (e.eventPhase == EventPhase.CAPTURING_PHASE); –