[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: 1 timer: 2 timer: 3 timer: 4 timer: 5 timerComplete: 下一节讲:[5.使用 addEventListener 方法(EventDispatcher 类)]
经典论坛讨论: http://bbs.blueidea.com/thread-2768209-1-1.html
出处:蓝色理想
责任编辑:蓝色月光
上一页 [AS2]事件处理机制 -- 使用回调函数 下一页 [AS2]事件处理机制 -- 使用addListener方法 二
◎进入论坛Flash专栏版块参加讨论
|