在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);
}
}
所有自定义事件最终的输出结果如下图: