转自 : http://blog.csdn.net/aisajiajiao/article/details/6960475
在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;
- }
- }
第三种方法,实现IEventDispatcher接口。
- 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);
- }
- }
所有自定义事件最终的输出结果如下图: