Signals框架介绍(二)高级事件
注意:本文参考An introduction to AS3 Signals写成,但不是翻译,有增删改。
- 第一部分:Signals框架介绍(一)基本用法
- 第三部分:Signals框架介绍(三)原生事件
也许你现在又想起了AS3内置事件框架的好处,希望使用currentTarget?或者希望支持冒泡?OK,Signals也能满足你那多变的心……(貌似是我自己多变罢了ˇ^ˇ)
###高级事件
使用DeluxeSignal可以实现更高级的事件传递。还是基于闹钟的例子进行修改,将原来AlarmClock中的Signal改为DeluxSignal:
[AlarmClock.as]
1public function AlarmClock()
2{
3 //将自己作为引用传递给DeluxeSignal,同时增加GenericEvent的传递
4 alarm = new DeluxeSignal(this, GenericEvent, Date);
5}
6
7public var alarm:DeluxeSignal;
8
9public function ring():void
10{
11 alarm.dispatch(new GenericEvent(), new Date());
12}
修改Wakeup.as中的处理器函数,让它能够接受到传递的2个参数。
[Wakeup.as]
1private function handler_ring($evt:GenericEvent, $date:Date):void
2{
3 trace('currentTarget:',$evt.currentTarget);
4 trace('target:',$evt.target);
5 trace('signal:',$evt.signal);
6 trace('起床了!!!也不看看几点了:'+$date.toString());
7}
在这里出现的GenericEvent,并非继承自flash.events.Event,而是实现了Signals自己的IEvent接口,与AS3的事件机制毫无关系。取一个貌似兄弟的名称,是为了方便大家理解罢了。它所提供的currentTarget和target属性,也是由IEvent自身提供。
运行修改后的例子,可以看到如下输出:
[trace] currentTarget: [object AlarmClock] [trace] target: [object AlarmClock] [trace] signal: [object DeluxeSignal] [trace] 起床了!!!也不看看几点了:Mon Jan 23 17:07:16 GMT+0800 2012
现在,是不是可以对currentTarget“为所欲为”了呢?
冒泡事件
Signals一样可以冒泡,而且并不依赖AS3自带的事件机制。当然,发送和接收冒泡事件的对象必须处于显示列表中。
为了让AlarmClock能够被加入显示列表,我们让AlarmClock继承Sprite。而抛出冒泡事件就非常简单,只需要在实例化GenericEvent的同时传递true参数即可。看看AlarmClock类被修改的部分吧:
[AlarmClock.as]
1public class AlarmClock extends Sprite
2{
3 public function ring():void
4 {
5 alarm.dispatch(new GenericEvent(true), new Date());
6 }
7}
接收事件的类,必须实现IBubbleEventHandler接口,在onEventBubbled中处理冒泡事件。同时,要将_alarm实例加入显示列表。
为了方便查看冒泡效果,可以将addOnce所在的一行注释掉,只接收冒泡事件。
[Wakeup.as]
1public class Wakeup extends Sprite implements IBubbleEventHandler
2{
3 public function Wakeup()
4 {
5 _alarm = new AlarmClock();
6 addChild(_alarm);
7 //_alarm.alarm.addOnce(handler_ring);
8 _alarm.ring();
9 }
10
11 public function onEventBubbled($evt:IEvent):Boolean
12 {
13 trace('冒泡 currentTarget:',$evt.currentTarget);
14 trace('冒泡 target:',$evt.target);
15 trace('冒泡 signal:',$evt.signal);
16 //返回false代表不再继续冒泡
17 return false;
18 }
19}
运行修改后的例子,可以看到如下输出:
[trace] 冒泡 currentTarget: [object Wakeup] [trace] 冒泡 target: [object AlarmClock] [trace] 冒泡 signal: [object DeluxeSignal]
###完整的类
[AlarmClock.as]
1package
2{
3import flash.display.Sprite;
4import org.osflash.signals.Signal;
5import org.osflash.signals.DeluxeSignal;
6import org.osflash.signals.events.GenericEvent;
7
8/**
9* Signals闹钟范例
10* @author Aiden Tailor(http://www.developria.com/2010/10/an-introduction-to-as3-signals.html)
11* @author zrong(zengrong.net)
12*/
13
14public class AlarmClock extends Sprite
15{
16 public function AlarmClock()
17 {
18 alarm = new DeluxeSignal(this, GenericEvent, Date);
19 }
20
21 public var alarm:DeluxeSignal;
22
23 public function ring():void
24 {
25 //使用冒泡的方式发布闹钟的响铃事件
26 alarm.dispatch(new GenericEvent(true), new Date());
27 }
28}
29}
30</pre>
31
32**[Wakeup.as]**
33
34<pre lang="ActionScript" line="1" coloa="+">
35package
36{
37import flash.display.Sprite;
38import org.osflash.signals.events.GenericEvent;
39import org.osflash.signals.events.IBubbleEventHandler;
40import org.osflash.signals.events.IEvent;
41
42[SWF(width=500,height=300,frameRate=30,backgroundColor=0xFFFFFF)]
43/**
44 * 测试闹钟
45 * @author Aiden Tailor(http://www.developria.com/2010/10/an-introduction-to-as3-signals.html)
46 * @author zrong(zengrong.net)
47 */
48public class Wakeup extends Sprite implements IBubbleEventHandler
49{
50 public function Wakeup()
51 {
52 _alarm = new AlarmClock();
53 addChild(_alarm);
54 _alarm.alarm.addOnce(handler_ring);
55 _alarm.ring();
56 }
57
58 private var _alarm:AlarmClock;
59
60 private function handler_ring($evt:GenericEvent, $date:Date):void
61 {
62 trace('currentTarget:',$evt.currentTarget);
63 trace('target:',$evt.target);
64 trace('signal:',$evt.signal);
65 trace('起床了!!!也不看看几点了:'+$date.toString());
66 }
67
68 public function onEventBubbled($evt:IEvent):Boolean
69 {
70 trace('冒泡 currentTarget:',$evt.currentTarget);
71 trace('冒泡 target:',$evt.target);
72 trace('冒泡 signal:',$evt.signal);
73 //返回false代表不再继续冒泡
74 return false;
75 }
76}
77}
- 文章ID:1504
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/as3_signal_intro2/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。