-1

我正在尝试将一系列外部加载的 swf 的投影仪放在一起,我的一般问题将尽可能简短。

如果加载到的外部 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 });

后者似乎更强大,因此我正在努力让它发挥作用,但我想我已经错过了一些课程;-) 有人经历过吗?我的方法是正确的还是应该走另一条路?

大家加油。

4

1 回答 1

0

通过在调度事件时将气泡选项设置为 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

瑞士法郎:

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.swfTimer在添加到舞台后 5 秒分派一个事件。当它调度事件时,气泡和可取消选项设置为 true。

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

于 2011-05-29T15:19:28.377 回答