我最近在as3中遇到了很多关于自定义事件的问题,我搜索了一些没有帮助的东西,并使用本教程试图找出它们但我仍然感到困惑。
所以我设置了一个新的flash fla文件来测试它们并且无法弄明白,这就是我所拥有的:
文档为文件:
package
{
import flash.events.MouseEvent;
import flash.display.MovieClip;
public class Custom extends MovieClip
{
var intializer:Initializer;
var added:Added;
public function Custom()
{
intializer=new Initializer();
addChild(intializer);
intializer.addEventListener(MouseEvent.CLICK, OnClicker);
addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch);
}
private function OnClicker(event:MouseEvent):void
{
added=new Added();
added.x=300; added.y=300;
addChild(added);
}
private function OnCatch(event:CustomEvent):void
{
trace("hi");
removeChild(added);
}
}
}
事件为文件:
package
{
import flash.events.Event;
public class CustomEvent extends Event
{
public static const EVENT_CUSTOM="event1";
public function CustomEvent(type)
{
super(type, false, false);
}
}
}
和动画片段作为文件:
package
{
import flash.events.MouseEvent;
import flash.display.MovieClip;
public class Added extends MovieClip
{
var addedButton:AddedButton;
public function Added()
{
addedButton=new AddedButton();
addedButton.x=30; addedButton.y=30;
addChild(addedButton);
addedButton.addEventListener(MouseEvent.CLICK, OnClickie);
}
private function OnClickie(event:MouseEvent):void
{
dispatchEvent(new CustomEvent(CustomEvent.EVENT_CUSTOM));
}
}
}
按钮使用一个空类,这给了我这个结果:(第一个按钮的左上角。) http://www.fastswf.com/_EfGSoQ
很抱歉这么多代码,但自定义事件似乎需要很多代码。
答案 0 :(得分:3)
问题似乎是你在错误的地方听你的自定义事件。您可以使用事件冒泡,事件的捕获阶段或通过侦听调度事件的对象(事件目标)来解决这几种方式。
Flash Event Model遵循W3C事件模型(在DOM / Javascript中使用)。调度事件时,它会经历三个阶段:捕获阶段,目标阶段和冒泡阶段。它在上面的链接中描述(在“事件传播和阶段”部分中)。
出于性能原因(我的假设),默认情况下不启用捕获和冒泡阶段。
请注意,您只需执行以下3项操作中的一项。我建议使用事件目标,这是最容易理解的。其他人有他们的位置,可能非常有用,但你可以完成目标阶段的大部分工作。
在您的文档类中,从构造函数中删除此行:
addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch);
删除它,因为我们将直接监听来自Added
对象的事件(它是事件目标)。要做到这一点,请更改在文档类中添加对象的代码:
private function OnClicker(event:MouseEvent):void
{
added=new Added();
added.x=300; added.y=300;
addChild(added);
added.addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch);
}
在文档类中,添加事件侦听器时添加其他参数以启用捕获阶段:
addEventListener(CustomEvent.EVENT_CUSTOM, OnCatch, true);
这允许事件目标的任何父级处理事件,在目标之前处理它。
要使用冒泡阶段,您的自定义事件对象需要“冒泡”。因此,您需要修改自定义事件类中的构造函数:
public function CustomEvent(type)
{
super(type, true, false);
}
我在调用super()
时更改了第二个参数,允许事件“冒泡”。
由于事件现在会使显示列表重新启动,因此事件目标的任何父级也可以在目标处理
之后侦听事件。