在AS3中实现自定义事件发送者有多种方法,这几天第四次看黑羽的殿堂之路,顺势就写下了,其本质只有一个EventDispatcher。
AS3是面向对象的语言,面向对象思想解析如下图:
所以在这里我们也有多种方法来实现自定义事件发送类。
这里有三种:
1.通过继承来实现;
2.通过复合来实现;
3.通过实现接口来实现。
在AS3事件中有3个要素,如下图所示,我们现在要实现的是自定义一个EventDispatcher。
第一种方法:继承EventDispatcher来实现
package { import flash.display.Sprite; import flash.events.Event; import flash.events.EventDispatcher; /** * ... * @author aisajiajiao * 使用继承来实现 */ public class CustomEventDispatcherDemo extends Sprite { public function CustomEventDispatcherDemo() { var dispatcher:SampleEventDispatcher = new SampleEventDispatcher(); //不推荐直接使用字符串表示事件类型,这里只是作为演示 dispatcher.addEventListener("Custom",actionListener); dispatcher.dispatchEvent(new Event("Custom")); } private function actionListener(e:Event):void { trace("自定义事件发送类" + e); } } } import flash.events.Event; import flash.events.EventDispatcher; //继承 class SampleEventDispatcher extends EventDispatcher { //这里可以写一些自己需要的代码 }
package { import flash.display.Sprite; import flash.events.Event; import flash.events.EventDispatcher; /** * ... * @author aisajiajiao * 使用复合来实现 */ public class CustomEventDispatcherDemo2 extends Sprite { public function CustomEventDispatcherDemo2() { var dispatcher:SampleEventDispatcher = new SampleEventDispatcher(); //这里我们可以看出使用复合之后,该类就不能再看做EventDispatcher对象了 dispatcher.getEventDispatcher().addEventListener("Custom",actionListener); dispatcher.getEventDispatcher().dispatchEvent(new Event("Custom")); } private function actionListener(e:Event):void { trace("自定义事件发送类" + e); } } } import flash.events.Event; import flash.events.EventDispatcher; class SampleEventDispatcher { private var _dispatcher:EventDispatcher; public function SampleEventDispatcher() { _dispatcher = new EventDispatcher(); } //get方法 public function getEventDispatcher():EventDispatcher { return _dispatcher; } }
package { import flash.display.Sprite; import flash.events.Event; import flash.events.EventDispatcher; /** * ... * @author aisajiajiao * 使用IEventDispatcher接口 */ public class CustomEventDispatcherDemo3 extends Sprite { public function CustomEventDispatcherDemo3() { var dispatcher:SampleEventDispatcher = new SampleEventDispatcher(); //不推荐直接使用字符串表示事件类型,这里只是作为演示 dispatcher.addEventListener("Custom",actionListener); dispatcher.dispatchEvent(new Event("Custom")); } private function actionListener(e:Event):void { trace("自定义事件发送类" + e); } } } import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; //这样灵活性非常大,可以在这里实现你想要的各种功能 class SampleEventDispatcher implements IEventDispatcher { public var _dispatcher:EventDispatcher; public function SampleEventDispatcher() { _dispatcher = new EventDispatcher(); } public function addEventListener(type:String,listener:Function, useCapture:Boolean = false,priority:int = 0,useWeakReference:Boolean = false):void { _dispatcher.addEventListener(type,listener,useCapture,priority,useWeakReference); } public function dispatchEvent(event:Event):Boolean { return _dispatcher.dispatchEvent(event); } public function hasEventListener(type:String):Boolean { return _dispatcher.hasEventListener(type); } //注意这里的参数个数是与addEventListener数目不同的,仅有3个 public function removeEventListener(type:String,listener:Function,useCapture:Boolean = false):void { _dispatcher.removeEventListener(type,listener,useCapture); } public function willTrigger(type:String):Boolean { return _dispatcher.willTrigger(type); } }
所有自定义事件最终的输出结果如下图: