我有自定义事件类
public class FFTDrawEvent extends Event {
public static const DRAW_EVENT:String = "drawEvent";
private var _param:Array = new Array();
public function FFTDrawEvent(type:String, __param:Array, bubbles:Boolean=true, cancelable:Boolean=false) {
_param = __param;
super(type, bubbles, cancelable);
}
public function get param():Array {
return _param;
}
}
此事件由扩展EventDispatcher
:
public class ToneGenerator extends EventDispatcher {
public function someFunction():void {
this.dispatchEvent(new FFTDrawEvent(FFTDrawEvent.DRAW_EVENT,_param));
}
另一节课听这个事件。这个类正在扩展SpriteVisualElement。
public class SpectrumVisualizer extends `SpriteVisualElement`:
{
public function SpectrumVisualizer()
{
this.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
}
不幸的是,这不起作用。调度该事件(返回true),但永远不会触发事件侦听器。
两个类(Dispatcher& Listener)都是MXML应用程序的Child类。也听父MXML应用程序中的事件不起作用。在调度类本身中以某种方式监听事件。
我不得不感觉EventDispatcher类不适合将事件分派给mxml应用程序或者相应的AS类,这些类是从MXML组件类扩展/固有的。
任何人都可以帮助我吗?
答案 0 :(得分:3)
您应该监听调度员的事件。在您的情况下,ToneGenerator
的实例正在调度该事件并且SpectrumVisualizer
正在侦听 - 它将无效。
在调度类本身中以某种方式监听事件。
这是唯一可行的方式。
致电时
this.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
只要this
对象(this.draw
对象)调度this
类型的事件,您就告诉FFTDrawEvent.DRAW_EVENT
对象调用toneGen.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
方法。将其更改为
toneGen
现在,只要this.draw
对象(toneGen
对象)调度FFTDrawEvent.DRAW_EVENT
类型的事件,您就告诉toneGen.addEventListener(FFTDrawEvent.DRAW_EVENT, specVis.draw);
对象调用specVis.draw
方法。
您还可以从父mxml执行以下操作。
toneGen
只要FFTDrawEvent.DRAW_EVENT
对象调度{{1}}类型的事件,就调用{{1}}方法。
答案 1 :(得分:1)
马丁,
问题是听众倾听本身而不是听取事件调度员。这是正确的代码:
public class SpectrumVisualizer extends SpriteVisualElement
{
public function SpectrumVisualizer()
{
toneGenerator = new ToneGenerator();
toneGenerator.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
toneGenerator.someFunction();
}
private var toneGenerator:ToneGenerator;
private function draw(event:FFTDrawEvent):void
{
trace("draw");
}
}
This will help you to understand events.
P.S:如果您尝试使用冒泡,请参阅文档中的相应部分。这里不起作用,因为事件在显示列表中“冒泡”仅,而ToneGenerator不是可视对象(Sprite,MovieClip,...)。