as3-signals,一个as3开源库,地址:https://github.com/robertpenner/as3-signals/downloads,主要功能相当于as3中的事件,但实现起来比as3自带事件机制要简单,据说运行效率是其4倍!
在as3中自定义类,且要发送自定义事件,有两种方法:
第一就是自定义类继承EventDispatcher类或者实现IEventDispatcher接口
第二就是用组合的方式,在自定义类中,实例化一个可以发送事件的对象,这个对象当然必须也是继承自EventDispatcher或者实现IEventDispatcher接口
所以,as3中要发送事件,必须跟EventDispatcher类或者IEventDispatcher接口扯上关系,而自定义事件,必须继承自Event类,如果你在运行中此事件需要转发,还得重写Event类中的clone方法。
如果使用as3-signals这一切将会变得简单,不用自定义事件,也不用与EventDispatcher类或者IEventDispatcher接口有关系,但必须使用组合的方式使用as3-signals,即:将Signal的实例组合到需发事件的自定义类中。下面详细说一下:
先写一个自定义数据类型UserVo:
package vo
{
importflash.display.Sprite;
publicclass UserVo
{
publicvar userName:String;
publicvar age:int;
publicvar foods:Array = [3,2,3,4,new Sprite()];
publicfunction UserVo()
{
}
}
}
第一种常用情况,发送不带任何参数的事件,即不发送as3事件机制中的事件对象。
自定义类:Rect,此类需要发送事件(信号)的,但我们不继承EventDispatcher也不实现IEventDispatcher接口。
package view
{
importflash.display.Sprite;
importsignals.ClickSignal;
importvo.UserVo;
publicclass Rect extends Sprite
{
publicvar clickSignal:ClickSignal;
publicfunction Rect()
{
super();
clickSignal= new ClickSignal();
}
publicfunction click():void
{
clickSignal.dispatch();
}
}
}
clickSignal是用组合方式添加的事件(信号),click方法用于发送事件(信号)。使用方法:
public function SignalsTest()
{
varrect:Rect = new Rect();
rect.clickSignal.add(onClick);
rect.click();
}
private function onClick():void
{
trace("onClick");
}
onClick函数是事件的监听函数。它不带任何参数。
第二种常用情况,发送带参数的信号(事件)
修改Rect类,如下:
package view
{
importflash.display.Sprite;
importsignals.ClickSignal;
importvo.UserVo;
publicclass Rect extends Sprite
{
publicvar clickSignal:ClickSignal;
publicfunction Rect()
{
super();
clickSignal= new ClickSignal(Number,String,Boolean,Object);
}
publicfunction click():void
{
clickSignal.dispatch(4,"sdfdsfdsfds",Boolean(3),newUserVo());
}
}
}
在ClickSignal构造函数中,传入类名称:Number,String,Boolean,Object,表示ClickSignal事件会带有4个参数,数据类型分别是Number,String,Boolean,Object类型,
如果有更多的参数,还可以继续在构造函数中的参数中增加下去,但是调用clickSignal.dispatch()方法时,参数顺序,数据类型,个数必须跟构造函数一一对应。使用方法如下:
public function SignalsTest()
{
varrect:Rect = new Rect();
rect.clickSignal.add(onClick);
rect.click();
}
private functiononClick(a:Number,b:String,c:Boolean,d:Object):void
{
trace(dis UserVo);//true
trace(d.foodsis Array);//true
trace(d.foods[4].name,Sprite(d.foods[4]).loaderInfo);//instance2null
trace("onClick==>",a,b,c,d);//onClick==>4 sdfdsfdsfds true [object UserVo]
}
上面的例子中,我们只知道了事件带有的参数,但并不清楚事件是谁发出来的,下面的例子即解决这个问题,下面要用到DeluxeSignal和GenericEvent类,他会作为一个事件对象传递给事件接收
函数,在此事件对象中包含了事件的目标!
新建自定义类:Circle,如下:
package view
{
importflash.display.Sprite;
importorg.osflash.signals.DeluxeSignal;
importorg.osflash.signals.events.GenericEvent;
publicclass Circle extends Sprite
{
publicvar signal:DeluxeSignal;
publicfunction Circle()
{
signal= new DeluxeSignal(this);
}
publicfunction dispatch():void
{
signal.dispatch(newGenericEvent(),4,"6666666666");
}
}
}
DeluxeSignal构造函数中传入的参数将会被作为事件的目标存入事件对象中(即:GenericEvent对象)。DeluxeSignal类包含了Signal类所有功能,所以发送DeluxeSignal事件(信号)也是可以自定义参数的。
signal.dispatch(newGenericEvent(),4,"6666666666");
dispatch方法有三个参数:
第一个:GenericEvent对象,包含了事件的目标,是否冒泡等信息
第二个,第三个...:是附带的参数,可以有多个参数,只需要继续往后面添加即可。
具体使用方法如下:
public function SignalsTest()
{
varcircle:Circle = new Circle();
circle.signal.add(onDispatch);
circle.dispatch();
}
private functiononDispatch(e:GenericEvent,a:Number,b:String):void
{
trace(e.signal);//[objectDeluxeSignal]
trace(e.currentTarget,e.target);//[objectCircle] [object Circle]
trace(a,b);//46666666666
}
第三种常用情况,简化as3自带的事件。
自定义类Native,当被添加到舞台时,绘制一个矩形,当被点击时,重绘矩形。
package view
{
importflash.display.Sprite;
importflash.events.Event;
importflash.events.MouseEvent;
importorg.osflash.signals.natives.NativeSignal;
publicclass Native extends Sprite
{
privatevar nativeSignal:NativeSignal;
privatevar clickSignal:NativeSignal;
publicfunction Native()
{
nativeSignal= new NativeSignal(this,Event.ADDEDE_TO_STAG,Event);
nativeSignal.addOnce(draw);
clickSignal= new NativeSignal(this,MouseEvent.CLICK,MouseEvent);
clickSignal.add(onClick);
}
privatefunction draw(e:Event):void
{
this.graphics.clear();
this.graphics.beginFill(0x0000ff,0.5);
this.graphics.drawRect(0,0,200,150);
this.graphics.endFill();
}
privatefunction onClick(e:MouseEvent):void
{
this.graphics.clear();
this.graphics.beginFill(Math.random()*0xffffff,0.5);
this.graphics.drawRect(0,0,200,150);
this.graphics.endFill();
}
}
}
NativeSignal类负责监听系统事件如:Event.ADDEDE_TO_STAG,MouseEvent.CLICK等,
add方法有三个参数可以填:1.事件目标;2.事件类型;3.事件类名称
调用clickSignal.add(onClick);后,当鼠标点击时,即会执行onClick函数。
有关更多as3-signals的介绍可以看下面的链接:
http://www.developria.com/2010/10/an-introduction-to-as3-signals.html
https://github.com/robertpenner/as3-signals/downloads