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
{
import flash.display.Sprite;
public class UserVo
{
public var userName:String;
public var age:int;
public var foods:Array = [3,2,3,4,new Sprite()];
public function UserVo()
{
}
}
}
第一种常用情况,发送不带任何参数的事件,即不发送as3事件机制中的事件对象。
自定义类:Rect,此类需要发送事件(信号)的,但我们不继承EventDispatcher也不实现IEventDispatcher接口。
package view
{
import flash.display.Sprite;
import signals.ClickSignal;
import vo.UserVo;
public class Rect extends Sprite
{
public var clickSignal:ClickSignal;
public function Rect()
{
super();
clickSignal = new ClickSignal();
}
public function click():void
{
clickSignal.dispatch();
}
}
}
clickSignal是用组合方式添加的事件(信号),click方法用于发送事件(信号)。使用方法:
public function SignalsTest()
{
var rect:Rect = new Rect();
rect.clickSignal.add(onClick);
rect.click();
}
private function onClick():void
{
trace("onClick");
}
onClick函数是事件的监听函数。它不带任何参数。
第二种常用情况,发送带参数的信号(事件)
修改Rect类,如下:
package view
{
import flash.display.Sprite;
import signals.ClickSignal;
import vo.UserVo;
public class Rect extends Sprite
{
public var clickSignal:ClickSignal;
public function Rect()
{
super();
clickSignal = new ClickSignal(Number,String,Boolean,Object);
}
public function click():void
{
clickSignal.dispatch(4,"sdfdsfdsfds",Boolean(3),new UserVo());
}
}
}
在ClickSignal构造函数中,传入类名称:Number,String,Boolean,Object,表示ClickSignal事件会带有4个参数,数据类型分别是Number,String,Boolean,Object类型,
如果有更多的参数,还可以继续在构造函数中的参数中增加下去,但是调用clickSignal.dispatch()方法时,参数顺序,数据类型,个数必须跟构造函数一一对应。使用方法如下:
public function SignalsTest()
{
var rect:Rect = new Rect();
rect.clickSignal.add(onClick);
rect.click();
}
private function onClick(a:Number,b:String,c:Boolean,d:Object):void
{
trace(d is UserVo);//true
trace(d.foods is Array);//true
trace(d.foods[4].name,Sprite(d.foods[4]).loaderInfo);//instance2 null
trace("onClick==>",a,b,c,d);//onClick==> 4 sdfdsfdsfds true [object UserVo]
}
上面的例子中,我们只知道了事件带有的参数,但并不清楚事件是谁发出来的,下面的例子即解决这个问题,下面要用到DeluxeSignal和GenericEvent类,他会作为一个事件对象传递给事件接收
函数,在此事件对象中包含了事件的目标!
新建自定义类:Circle,如下:
package view
{
import flash.display.Sprite;
import org.osflash.signals.DeluxeSignal;
import org.osflash.signals.events.GenericEvent;
public class Circle extends Sprite
{
public var signal:DeluxeSignal;
public function Circle()
{
signal = new DeluxeSignal(this);
}
public function dispatch():void
{
signal.dispatch(new GenericEvent(),4,"6666666666");
}
}
}
DeluxeSignal构造函数中传入的参数将会被作为事件的目标存入事件对象中(即:GenericEvent对象)。DeluxeSignal类包含了Signal类所有功能,所以发送DeluxeSignal事件(信号)也是可以自定义参数的。
signal.dispatch(new GenericEvent(),4,"6666666666");
dispatch方法有三个参数:
第一个:GenericEvent对象,包含了事件的目标,是否冒泡等信息
第二个,第三个...:是附带的参数,可以有多个参数,只需要继续往后面添加即可。
具体使用方法如下:
public function SignalsTest()
{
var circle:Circle = new Circle();
circle.signal.add(onDispatch);
circle.dispatch();
}
private function onDispatch(e:GenericEvent,a:Number,b:String):void
{
trace(e.signal);//[object DeluxeSignal]
trace(e.currentTarget,e.target);//[object Circle] [object Circle]
trace(a,b);//4 6666666666
}
第三种常用情况,简化as3自带的事件。
自定义类Native,当被添加到舞台时,绘制一个矩形,当被点击时,重绘矩形。
package view
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import org.osflash.signals.natives.NativeSignal;
public class Native extends Sprite
{
private var nativeSignal:NativeSignal;
private var clickSignal:NativeSignal;
public function Native()
{
nativeSignal = new NativeSignal(this,Event.ADDEDE_TO_STAG,Event);
nativeSignal.addOnce(draw);
clickSignal = new NativeSignal(this,MouseEvent.CLICK,MouseEvent);
clickSignal.add(onClick);
}
private function draw(e:Event):void
{
this.graphics.clear();
this.graphics.beginFill(0x0000ff,0.5);
this.graphics.drawRect(0,0,200,150);
this.graphics.endFill();
}
private function 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