2011-05-29 68 views
-1

我试图拼凑外部加载的SWF中的一序列的投影机和我的一般问题将尽可能短,因为它可以。AS3:自定义事件传播

如果外部SWF装入ctrl(影片剪辑的一个实例在创作过程中放置​​在阶段)具有在其第一和最后一个帧:

dispatchEvent(new Event("FIRST_FRAME")); // in the first frame, and: 
dispatchEvent(new Event("LAST_FRAME")); // in the last frame 

然后 - 应这些事件是“听到”的CTRL内容器?

目前我只似乎能够将加载的内容内听那些事件,而不是“高”,我的意思是 - 如果我在装载机完整听众说:

mc:MovieClip = MovieClip(e.currentTarget.content); 
mc.addEventListener("LAST_FRAME", function(){ // something }); 

那么事件听到的,但不是我说:

ctrl.addEventListener("LAST_FRAME", function(){ // something }); 

后者似乎更为强劲,因此我挣扎,它的工作,但我想我已经错过了一些经验;-) 有任何人都通过这个?我的方法是正确的还是应该采取另一条路?

欢呼每一个人。

+0

,你可以得到调度,你加载到当前的应用程序事件的SWF,然后你的swf添加到一个名为'ctrl'的显示对象?如果是这样你需要启用冒泡时发出事件像这样'dispatchEvent(新的事件(“FIRST_FRAME”,真));” – Taurayi 2011-05-29 14:19:25

回答

0

你可以让你的crtl显示对象通过在分派你的事件时将bubbles选项设置为true来接收从外部swf分派的事件。请看下面的例子,其中swfB.swf也被装入swfA.swf编写:

SWFB:

package swfb 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 

    public class Main extends Sprite 
    { 
     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      const SECOND:int = 1000; 

      var timer:Timer = new Timer(5 * SECOND, 1); 
      timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); 
      timer.start(); 

     }// end function 

     private function onTimerComplete(e:TimerEvent):void 
     { 
      dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE, true, true)); 

     }// end function 

    }// end class 

}// end package 

SWFA:

package swfa 
{ 
    import flash.display.Loader; 
    import flash.display.LoaderInfo; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.TimerEvent; 
    import flash.net.URLRequest; 

    public class Main extends Sprite 
    { 
     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var loader:Loader = new Loader(); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete); 
      loader.load(new URLRequest("swf/SWFB.swf")); 


     }// end function 

     private function onLoaderComplete(e:Event):void 
     { 
      var loaderInfo:LoaderInfo = LoaderInfo(e.target); 

      var container:Sprite = new Sprite(); 
      container.addChild(loaderInfo.content); 
      container.addEventListener(TimerEvent.TIMER_COMPLETE, onContainerTimerComplete); 
      addChild(container); 

     }// end function 

     private function onContainerTimerComplete(e:TimerEvent):void 
     { 
      trace("TIMER COMPLETE!"); 

      e.stopPropagation(); 

     }// end function 

    }// end class 

}// end package 

swfB.swf也将调度Timer事件它加入5秒后到舞台。当它分派事件时,气泡和可取消选项设置为true。

在swfA.swf编写的swfB.swf也被加载到它,然后加入到称为container的显示对象容器。然后,将一个事件侦听器添加到容器,该容器侦听SWFB.swf中的Timer事件以进行分派。当它的派出onContainerTimerComplete()事件处理程序调用计时器事件的stopPropagation()方法(顾名思义)阻止事件的传播。

+0

多谢您详细的课程我都没有想到这两个事件属性,但这是有道理的,不幸的是我现在无法深入这项工作,但很快就会尝试,再次感谢! – user776686 2011-05-30 19:22:34