如何将事件从SWFLoader中的SWF引发到父Flex应用程序?

时间:2008-10-12 06:18:48

标签: flex event-handling events swfloader

如何从加载到Flex应用程序中的SWF文件中引发事件(使用SWFLoader)?

我希望能够检测到

a) when a button is pressed
b) when the animation ends

5 个答案:

答案 0 :(得分:2)

你需要做两件事:

  1. 从加载的swf中调度事件。如果从嵌套视图发送事件,请确保事件起泡。可以通过事件的bubbles属性设置冒泡。
  2. 收听主应用程序中的事件。我认为您应该可以在SWFLoader实例的content属性上执行此操作。

    mySWFLoader.content.addEventListener("myEvent", myEventHandler);
    

答案 1 :(得分:2)

我采取了一种更加懒惰的方法来提升闪光灯内的事件

软硬度:

<mx:SWFLoader  source="homeanimations/tired.swf"  id="swfTired" complete="swfTiredLoaded(event)" />

private function swfTiredLoaded(event:Event): void {
     mySWFLoader.content.addEventListener("continueClicked", continueClickedHandler);
}

闪光:

dispatchEvent(new Event("continueClicked", true, true));

答案 2 :(得分:1)

我相信它是因为你将在Flash中创建两个单独的自定义事件类1,而在Flex中创建另一个。 Flex可能无法理解从Flash调度一个EV_NOTIFY.ANIMATION_ENDED,因为它有自己的EV_NOTIFY.ANIMATION_ENDED版本。

答案 3 :(得分:0)

作为Christophe Herreman答案的补充,如果你想知道,这是一种制作自己的事件的方式......

package yourpackage.events
{
    import flash.events.Event;

    [Event(name="EV_Notify", type="yourpackage.events.EV_Notify")]
    public class EV_Notify extends Event
    {
        public function EV_Notify(bubbles:Boolean=true, cancelable:Boolean=false)
        {
            super("EV_Notify", bubbles, cancelable);
        }

    }
}

我已经冒昧地将bubbles的默认值设置为true并默认将自定义事件类型传递给超级构造函数,因此您可以说...

dispatchEvent(new EV_Notify());

在您的特定情况下,我怀疑您有时不希望您的活动冒泡。

名称上的前缀EV_是我自己的事件约定,所以我可以在代码完成弹出窗口中轻松找到它们,你显然会选择自己的名字。

对于你引用的两个案例,你可以有两个事件并监听它们,或者在事件中添加一个属性来说明刚刚发生的事情,这是Alert之类的控制所采取的方法。 ...

package yourpackage.events
{
    import flash.events.Event;

    [Event(name="EV_Notify", type="yourpackage.events.EV_Notify")]
    public class EV_Notify extends Event
    {
        public static var BUTTON_PRESSED:int = 1;
        public static var ANIMATION_ENDED:int = 2;

        public var whatHappened:int;

        public function EV_Notify(whatHappened:int, bubbles:Boolean=true, cancelable:Boolean=false)
        {
            this.whatHappened = whatHappened;
            super("EV_Notify", bubbles, cancelable);
        }

    }
}

然后你把它称之为......

dispatchEvent(new EV_Notify(EV_NOTIFY.ANIMATION_ENDED));
然后,您可以检查事件处理程序中的whatHappened字段。

private function handleNotify(ev:EV_Notify):void
{
    if (ev.whatHappened == EV_Notify.ANIMATION_ENDED)
    {
        // do something
    }
    else if (ev.whatHappened == EV_Notify.BUTTON_PRESSED)
    {
        // do something else
    }
    etc...
}

HTH

答案 4 :(得分:0)

我无法使用最后一种方法(使用Flash CS4和Flex 3)。我将dispatchEvent调用放在我的Flash动画的最后一帧中,但无法在Flex中将其拾取。

我使用计数器变量并递增,直到我使用ENTER_FRAME事件到达已知的最后帧编号 - 我可以使用几乎相同的代码来获取。

如果我可以选择这个,那为什么我不能选择自定义事件呢?