如何从加载到Flex应用程序中的SWF文件中引发事件(使用SWFLoader)?
我希望能够检测到
a) when a button is pressed
b) when the animation ends
答案 0 :(得分: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事件到达已知的最后帧编号 - 我可以使用几乎相同的代码来获取。
如果我可以选择这个,那为什么我不能选择自定义事件呢?