Actionscript 3.0 事件机制剖析---事件发送方式(一)

            

         Actionscript 3.0 事件机制剖析

                                                                 事件发送方式(一)

  声明:欢迎任何人和组织转载本blog中文章,但必须标记文章原始链接和作者信息。

  本文链接:http://blog.csdn.net/li_007/archive/2009/03/02/3949445.aspx

  开拓进取的小乌龟------->CSDN点滴点点滴滴Blog

 

  在前面的文章中解释了Actionscript 3中的事件机制的几个步骤,也给出了一个自定义的事件的例子。但是在事件类定义后怎么发送事件呢?这是一个值得大家思考的问题,因为事件的发送关系到事件的监听。下面对这句话多说几句。

 

  前面文章已经说了,在Actionscript 3中要区分Event和Event Flow,Event事件是直接将事件发送到target,中间没有Event Flow的Capture phases、Target Phases和Bubbling Phases三个阶段(在后面的blog中我会讲到Event Flow,在下面文章中提到的Event都是普通的Event,不牵涉到Display List,也就不牵涉到Event Flow),所以这样的话,肯定是谁发送事件,谁就负责监听事件。

 

   在Actionscript 3中Event Class是负责提供各种事件,比如Error,ADD ,etc.来给EventDispatcher class对象来使用,故要想实现事件的发送,就必须用到EventDispatcher class或者它的子类,而EventDispatcher class是实现了IEventDispather Interface。所以这样我们可以有三种实现事件发送的方法:继承EventDispatcher class、复合EventDispatcher 对象以及实现IEventDispatcher Interface。

 

    下面将上一篇blog中的事件发送方式改为继承EventDispatcher class的方法:

    1、AlarmEvent.as文件中定义的 Alarm Event class不做任何改变。

    2、增加AlarmDispatcher.as来定义继承自EventDispatcher class的子类AlarmDispatcher class,代码实现如下:

package { import flash.events.EventDispatcher; /** * Written by Leezhm, 28th February, 2009 * Contact : [email protected] * Last Modified by Leezhm on 1st March, 2009 **/ public class AlarmDispatcher extends EventDispatcher { private var _alarmEvent:AlarmEvent; public function dispatcherMsg(msg:String):void { if ("" != msg) { if (null == this._alarmEvent) { this._alarmEvent = new AlarmEvent(); } this._alarmEvent.message = msg; this.dispatchEvent(this._alarmEvent); } } } }

 

    3、修改TestEvent class中的OnTimerClock方法如下:

/** * Dispatch the TIME_ALARM event when the currrent time was be * the alarm setting time */ private function OnTimerClock(evt:TimerEvent):void { var _alarmDispatcher:AlarmDispatcher = new AlarmDispatcher(); _alarmDispatcher.addEventListener(AlarmEvent.TIME_ALARM, OnAlarmClock); _alarmDispatcher.dispatcherMsg("Please get up!!!It's time for breakfast!!!"); }         

 

   当然针对TIMER_ALARM的监听也应该由AlarmDispatcher Class的实例对象来监听了,不然就无法收到事件。

 

   对比这种方式和先前没修改之前的方式有什么不一样呢?其实是一样的,先前本来就是继承EventDispatcher class来发送事件的。原因是:所有的Actionscript 3的显示对象都是DisplayObject或者其子类的实例,而DisplayObject又是事件发送类EventDispatcher的子类,因此所有的显示对象都可以发送事件了。在本例中TestEvent继承了文档类Sprite,显然Sprite也是显示对象,也当然就继承了EventDispatcher的方法,也就可以直接this.dispatcherEvent(...)了。

你可能感兴趣的:(timer,function,Blog,Class,interface,actionscript)