Signals框架介绍(一)基本用法
2013-02-27 16:02
387 查看
注意:本文参考An introduction to AS3 Signals写成,但不是翻译,有增删改。
第二部分:Signals框架介绍(二)高级事件
第三部分:Signals框架介绍(三)原生事件
Signals是一个基于AS3的轻量级事件框架,它被设计用来代替AS3内置的Event框架。
为什么我们要放弃Event框架,改用Signals呢?原因主要有以下几点:
使用AS3内置的Event框架,必须继承EventDispatcher或者自行实现IEventDispatcher,而Signals使用组合,可以避免继承;
使用AS3内置框架在事件中实现值的传递,必须自定义事件类才可以。而Signals可以方便的实现多个强类型值的传递;
Signals不使用字符串来区分不同的事件,而是使用实例;
Signals的速度更快,据说是AS3内置事件机制的4倍。
来看个简单的例子吧,这个例子中的闹钟会叫我们起床。此范例部分源码来自An introduction to
AS3 Signals
先看看闹钟类AlarmClock.as
?View
Code ACTIONSCRIPT
再来看看起床类Wakeup.as
?View
Code ACTIONSCRIPT
在进行事件注册的时候,我们使用的是AlarmClock的public属性alarm。在面向对象编程中,这种方式是不可取的。但我们现在只是个范例对么?不要要求那么严格好不好?
当然,如果你知道在AS3中,使用get方法会比直接使用public属性的性能低不少,或许你也会让这种“不规范”的编程方法延续下去?
如果运行这个范例,应该可以看到2条“起床了!!!”的trace信息。然后,取消addOnce一行的注释,并注释掉add那行,让它们变成这样:
?View
Code ACTIONSCRIPT
再次运行范例,应该只能看到1条trace信息了。你可以把这种现象理解成原来的AS事件机制中的removeEventDispatcher被自动执行了。
当然,手动移除也是可以的。如果你使用的是add方法注册,可以使用下面的方法来移除事件的注册。
?View
Code ACTIONSCRIPT
看看传递参数有多简单吧……修改AlarmClock.as中的相关代码:
?View
Code ACTIONSCRIPT
再修改Wakeup.as中的相关代码:
?View
Code ACTIONSCRIPT
就这样,不需要该死的继承Event和重写clone()了,是不是很清净呢?
转载:http://zengrong.net/post/1504.htm
第二部分:Signals框架介绍(二)高级事件
第三部分:Signals框架介绍(三)原生事件
Signals是一个基于AS3的轻量级事件框架,它被设计用来代替AS3内置的Event框架。
为什么我们要放弃Event框架,改用Signals呢?原因主要有以下几点:
使用AS3内置的Event框架,必须继承EventDispatcher或者自行实现IEventDispatcher,而Signals使用组合,可以避免继承;
使用AS3内置框架在事件中实现值的传递,必须自定义事件类才可以。而Signals可以方便的实现多个强类型值的传递;
Signals不使用字符串来区分不同的事件,而是使用实例;
Signals的速度更快,据说是AS3内置事件机制的4倍。
来看个简单的例子吧,这个例子中的闹钟会叫我们起床。此范例部分源码来自An introduction to
AS3 Signals
基本用法
先看看闹钟类AlarmClock.as?View
Code ACTIONSCRIPT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package { import org.osflash.signals.Signal; /** * Signals闹钟范例 * @author Aiden Tailor(http://www.developria.com/2010/10/an-introduction-to-as3-signals.html) * @author zrong(zengrong.net) */ public class AlarmClock { public function AlarmClock() { alarm = new Signal(); } /** * 声明一个Signal实例用来发送Signal */ public var alarm:Signal; public function ring():void { //发布闹钟的响铃事件 alarm.dispatch(); } } } |
?View
Code ACTIONSCRIPT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2930 | package { import flash.display.Sprite; [SWF(width=500,height=300,frameRate=30,backgroundColor=0xFFFFFF)] /** * 测试闹钟 * @author Aiden Tailor(http://www.developria.com/2010/10/an-introduction-to-as3-signals.html) * @author zrong(zengrong.net) */ public class Wakeup extends Sprite { public function Wakeup() { _alarm = new AlarmClock(); //向alarm注册事件,这里不需要提供任何的事件名称。因为alarm就是一个确定的Signal实例。 _alarm.alarm.add(handler_ring); //使用addOnce,让alarm在事件收到一次后立即取消 //_alarm.alarm.addOnce(handler_ring); _alarm.ring(); _alarm.ring(); } private var _alarm:AlarmClock; /** * 由于我们并没有在事件中传递参数,因此这里的方法也不需要提供任何参数。 */ private function handler_ring():void { trace('起床了!!!'); } } } |
当然,如果你知道在AS3中,使用get方法会比直接使用public属性的性能低不少,或许你也会让这种“不规范”的编程方法延续下去?
取消事件注册
如果运行这个范例,应该可以看到2条“起床了!!!”的trace信息。然后,取消addOnce一行的注释,并注释掉add那行,让它们变成这样:?View
Code ACTIONSCRIPT
1 2 3 4 5 6 7 8 9 10 11 12 13 | public function Wakeup() { _alarm = new AlarmClock(); //向alarm注册事件,这里不需要提供任何的事件名称。因为alarm就是一个确定的Signal实例。 //_alarm.alarm.add(handler_ring); //使用addOnce,让alarm在事件收到一次后立即取消 _alarm.alarm.addOnce(handler_ring); _alarm.ring(); _alarm.ring(); } |
当然,手动移除也是可以的。如果你使用的是add方法注册,可以使用下面的方法来移除事件的注册。
?View
Code ACTIONSCRIPT
1 2 | _alarm.alarm.remove(handler_ring); _alarm.alarm.removeAll(); |
传递参数
看看传递参数有多简单吧……修改AlarmClock.as中的相关代码:?View
Code ACTIONSCRIPT
1 23 | public function AlarmClock() { //让我们传递一个AS3的标准Date对象吧,让那个懒虫知道现在几点 alarm = new Signal(Date); } public function ring():void { //把当前的时间发出去 alarm.dispatch(new Date()); } |
?View
Code ACTIONSCRIPT
1 23 | private function handler_ring($date:Date):void { trace('起床了!!!也不看看几点了:'+$date.toString()); } |
转载:http://zengrong.net/post/1504.htm
相关文章推荐
- Android图片加载框架Glide的基本用法介绍
- EventBus框架的介绍和和基本用法(零基础都可以听懂的)
- Android HTTP网络通信(二):Volley框架——介绍、基本用法
- Ibatis 框架的基本介绍及基础操作
- Webx框架:Pipeline基本介绍
- Android开源框架Universal-Image-Loader基本介绍及使用
- Android图片加载框架最全解析(一),Glide的基本用法
- 手游基本框架的介绍
- Android图片加载框架-Glide的基本用法
- Spring学习一:基本框架图介绍与HelloWorld程序
- 【Android】在Android上使用OrmLite数据库框架 之 基本用法
- MongoDB基本介绍及一些用法
- 图片加载框架简单介绍<一> ImageLoader 的基本使用
- AfxBeginThread的介绍/基本用法
- Android图片加载框架最全解析(一),Glide的基本用法
- FlexboxLayout 的一些基本介绍与基本用法
- OKHttp的介绍和基本用法
- CoreText基本用法介绍
- java注解Annotation,的基本作用和用法的简明介绍
- 普通用户使用的命令-文件和目录管理类命令基本用法介绍