AS3:自定义事件传播

时间:2011-05-29 12:17:36

标签: actionscript-3 flash external event-propagation

我正在尝试组装一系列外部装载swfs的投影仪,我的一般问题将尽可能短。

如果外部swf加载到ctrl(在创作过程中放置​​在舞台上的MovieClip实例)的第一帧和最后一帧:

 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 });

后者似乎更加强大,因此我很难让它发挥作用,但我想我已经错过了一些教训;-) 有没有人经历过这个?我的方法是正确的还是我应该走另一条路?

为每个人欢呼。

1 个答案:

答案 0 :(得分:0)

通过在调度事件时将bubbles选项设置为true,您可以获取crtl显示对象以接收从外部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秒发送。当它调度事件时,bubbles和cancelable选项设置为true。

在SWFA.swf中,将SWFB.swf加载到其中,然后将其添加到名为container的显示对象容器中。然后将一个事件侦听器添加到容器中,该容器侦听要调度的SWFB.swf中的Timer事件。调度时,onContainerTimerComplete()事件处理程序调用Timer事件的stopPropagation()方法(顾名思义)停止传播事件。