as3-signals的使用介绍

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

posted @ 2011-05-07 15:33  ywxgod  阅读(2507)  评论(0编辑  收藏  举报