| [4.使用 addListener 方法(AsBroadcaster / BroadcasterMX 类)] 在 MovieClipLoader 和 Tween 等类中都用到了 addListener 方法来注册侦听.我们该怎么用呢? Macromedia 为我们提供了如下二个类:
 AsBroadcaster 属于系统类.
 BroadcasterMX 属于自定义类.类路径: mx.transitions.BroadcasterMX
 这两个类的很相似.它们都是提供事件通知和侦听器管理功能.
 但 AsBroadcaster 类是系统内置的.执行效率会比 BroadcasterMX 类快很多.所以这里我们就用 AsBroadcaster
 类来讲解.
 此类详细:
 public addListener(listenerObj:Object):Boolean         ---注册侦听器.
 public broadcastMessage(eventName:String):Void         ---广播消息/发送事件.
 public static initialize(obj:Object):Void                ---将事件通知和侦听器管理功能添加到给指定的对象
 public removeListener(listenerObj:Object):Boolean ---移除侦听器.
 public _listeners:Array [只读]                                     ---对已注册侦听器对象的引用.
 该怎么用呢? 看下面的示例:[4.1.示例: AsBEventClass 类(简单的示例)]
 此示例文档详细:
 Example/AS2/events/AsBEvent/AsBEventClass.as
 Example/AS2/events/AsBEvent/AsBEventExample.as
 Example/AS2/events/AsBEvent/AsBEventExample.xml
 Example/AS2/events/AsBEvent/AsBEventExample.fla
 主类:打开 CFEventClass.as  文档,输入下面的代码:
 import mx.utils.Delegate;//----------------------------------------
 class AsBEventClass extends AsBroadcaster
 {
 //----------------------------------------
 public var tXML:XML;
 //----------------------------------------
 public function AsBEventClass(url:String)
 {
 AsBroadcaster.initialize(AsBEventClass.prototype);
 this.tXML = new XML();
 this.tXML.onLoad = Delegate.create(this, this.XMLonLoad);
 this.tXML.load(url);
 }
 private function XMLonLoad(success:Boolean):Void
 {
 if (success) {
 this.broadcastMessage("complete");
 }
 }
 //----------------------------------------
 }
 保存文档.
 这里首先继承 AsBroadcaster 类.然后在构造函数中使用
 AsBroadcaster.initialize(AsBEventClass.prototype);来获取事件通知和侦听器管理功能.最后使用
 this.broadcastMessage("complete");来广播消息或发送事件.
 当然你也可以选择不继承它,但需要在类中添加下面的方法:
 public var addListener:Function;public var removeListener:Function;
 private var broadcastMessage:Function;
 示例类:
 打开 CFTimerExample.as 文档.输入下面的代码:
 import AsBEventClass;//----------------------------------------
 class AsBEventExample
 {
 public function AsBEventExample()
 {
 var ee:AsBEventClass = new AsBEventClass("AsBEventExample.xml");
 ee.addListener(this);
 }
 private function complete():Void
 {
 trace("complete");
 }
 }
 保存文档.
 在示例类中我们创建主类的一个实例.来加载 AsBEventExample.xml 文档.然后添加侦听器.
 如果要移除侦听器,请使用下面的方法:
 ee.removeListener(this);要加载的 XML 文档:
 打开 AsBEventExample.xml 文档,随便输入一些内容便可.测试用.
 示例 fla 文档:打开 AsBEventExample.fla 文档.将"图层 1"重命名为  Actions.并在第一帧中输入下面的代码:
 new AsBEventExample();保存文档.
 测试 Flash 文档.在 XML 文档成功加载后会在输出面板中显示以下内容
 complete如需给事件传递参数,在发送事件时如下添加参数:
 this.broadcastMessage("complete", 参数1, 参数2, 参数N);在调用事件时:
 private function complete(参数1, 参数2, 参数N){
 trace([参数1, 参数2, 参数N]);
 }
 下面再看一个示例:
 [4.2.示例: AsBTimer 类(定时器)]
 此示例文档详细:
 Classes/AS2/utils/AsBTimer.as
 Example/AS2/utils/AsBTimer/AsBTimerExample.as
 Example/AS2/utils/AsBTimer/AsBTimerExample.fla
 主类:打开 AsBTimer.as 文档,输入下面的代码:
 import AS2.utils.CFDelegate;//----------------------------------------
 class AS2.utils.AsBTimer extends AsBroadcaster
 {
 //----------------------------------------
 private var _timerID:Number;
 private var _delay:Number;
 private var _repeatCount:Number;
 private var _currentCount:Number = 0;
 private var _running:Boolean;
 //----------------------------------------
 /*
 @parameter    delay:            延迟,单位毫秒.
 @parameter    repeatCount:    重复次数.默认为Infinity(正无穷大);
 */
 public function AsBTimer(delay:Number, repeatCount:Number)
 {
 AsBroadcaster.initialize(AsBTimer.prototype);
 if (isNaN(delay)) {
 return;
 }
 if (isNaN(repeatCount)) {
 repeatCount = Infinity;
 }
 this._delay = delay;
 this._repeatCount = repeatCount;
 }
 //----------------------------------------
 public function reset():Void
 {
 this._currentCount = 0;
 this.stop();
 }
 public function start():Void
 {
 this._timerID = setInterval(CFDelegate.create(this, this.startTimer), this._delay);
 this._running = true;
 }
 public function stop():Void
 {
 clearInterval(this._timerID);
 this._running = false;
 }
 public function toString():String
 {
 return "[AsBTimer]";
 }
 //----------------------------------------
 private function startTimer():Void
 {
 this._currentCount++;
 this.broadcastMessage("timer", this._currentCount);
 if (this._currentCount == this._repeatCount) {
 this.reset();
 this.broadcastMessage("timerComplete");
 }
 }
 //----------------------------------------
 public function get delay():Number
 {
 return this._delay;
 }
 public function set delay(d:Number):Void
 {
 this._delay = d;
 }
 public function get repeatCount():Number
 {
 return this._repeatCount;
 }
 public function set repeatCount(r:Number):Void
 {
 this._repeatCount = r;
 }
 public function get currentCount():Number
 {
 return this._currentCount;
 }
 public function get running():Boolean
 {
 return this._running;
 }
 //----------------------------------------
 }
 因此类详细前面已讲,功能一样,只是事件处理机制不同而已.这里就不再啰嗦.
 示例类:打开 AsBTimerExample.as 文档.输入下面的代码:
 import AS2.utils.AsBTimer;//----------------------------------------
 class AsBTimerExample
 {
 //----------------------------------------
 public function AsBTimerExample()
 {
 var te:AsBTimer = new AsBTimer(1000, 5);
 te.addListener(this);
 te.start();
 }
 private function timer(currentCount:Number):Void
 {
 trace("timer: " + currentCount);
 }
 private function timerComplete():Void
 {
 trace("timerComplete: ");
 }
 //----------------------------------------
 }
 保存文档.
 示例 fla 文档:打开 AsBTimerExample.fla 文档,将"图层 1" 重命名为 Actions.并在第一帧中输入下面的代码:
 new AsBTimerExample();测试 Flash 文档.输出面板会陆续显示以下的内容:
 timer: 1timer: 2
 timer: 3
 timer: 4
 timer: 5
 timerComplete:
 下一节讲:[5.使用 addEventListener 方法(EventDispatcher 类)]
 经典论坛讨论:http://bbs.blueidea.com/thread-2768209-1-1.html
 出处:蓝色理想
责任编辑:蓝色月光
 上一页 [AS2]事件处理机制 -- 使用回调函数 下一页 [AS2]事件处理机制 -- 使用addListener方法 二 ◎进入论坛Flash专栏版块参加讨论
	      |