| [3.使用 回调函数] 回调函数也可以说是匿名函数,先看下面的代码: var myXML:XML = new XML();myXML.load("xml.xml");
 myXML.onLoad = function(success:Boolean)
 {
 trace(success);
 }
 XML.onLoad 是一个回调函数.将匿名函数与特定的事件关联,以创建回调函数.函数将在特定事件发生后调用回调函数.在自定义类中怎么做呢?看下面的示例.
 [3.1.示例: CFEventClass 类(简单的示例)]此示例文档详细:
 Example/AS2/events/CFEvent/CFEventClass.as
 Example/AS2/events/CFEvent/CFEventExample.as
 Example/AS2/events/CFEvent/CFEventExample.xml
 Example/AS2/events/CFEvent/CFEventExample.fla
 主类:打开 CFEventClass.as  文档,输入下面的代码:
 import mx.utils.Delegate;//----------------------------------------
 class CFEventClass
 {
 //----------------------------------------
 public var tXML:XML;
 //定义事件函数.
 public var complete:Function;
 //----------------------------------------
 public function CFEventClass(url:String)
 {
 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.complete();
 }
 }
 //----------------------------------------
 }
 保存文档,这样我们就创建了一个名为 CFEventClass 的类,拥有一个事件,一个属性,此事件在 XML 文档成功加载后发生. 示例类:打开 CFEventExample.as 文档,输入下面的代码:
 import CFEventClass;//----------------------------------------
 class CFEventExample
 {
 public function CFEventExample()
 {
 var ee:CFEventClass = new CFEventClass("CFEventExample.xml");
 ee.complete = this.complete;
 }
 private function complete():Void
 {
 trace("complete");
 }
 }
 保存文档.在示例类中我们创建主类的一个实例.来加载 CFEventExample.xml 文档.然后使用自定义函数与 complete 事件关联.
 如果要移除事件,请使用下面的方法:
 ee.complete = undefined//或
 ee.complete = null;
 //或
 delete ee.complete;
 要加载的 XML 文档:打开 CFEventExample.xml 文档,随便输入一些内容便可.测试用.
 示例 fla 文档:打开 CFEventExample.fla 文档.将"图层 1"重命名为  Actions.并在第一帧中输入下面的代码:
 new CFEventExample();
 保存文档.测试 Flash 文档.在 XML 文档成功加载后会在输出面板中显示以下内容
 complete 如需给事件传递参数,在执行事件函数时如下添加参数: this.complete(参数1, 参数2, 参数N); 在调用事件时: private function complete(参数1, 参数2, 参数N){
 trace([参数1, 参数2, 参数N]);
 }
 下面再看一个示例: [3.2.示例: CFTimer 类(定时器)]此示例文档详细:
 Classes/AS2/utils/CFTimer.as
 Example/AS2/utils/CFTimer/CFTimerExample.as
 Example/AS2/utils/CFTimer/CFTimerExample.fla
 主类:打开 CFTimer.as 文档,输入下面的代码:
 import mx.utils.Delegate;//----------------------------------------
 class AS2.utils.CFTimer
 {
 //----------------------------------------
 private var _timerID:Number;
 private var _delay:Number;
 private var _repeatCount:Number;
 private var _currentCount:Number = 0;
 private var _running:Boolean;
 //----------------------------------------
 public var timer:Function;
 public var timerComplete:Function;
 //----------------------------------------
 /*
 @parameter    delay:            延迟,单位毫秒.
 @parameter    repeatCount:    重复的次数.默认为Infinity(正无穷大);
 */
 public function CFTimer(delay:Number, repeatCount:Number)
 {
 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 "[CFTimer]";
 }
 //----------------------------------------
 private function startTimer():Void
 {
 this._currentCount++;
 this.timer(this._currentCount);
 if (this._currentCount == this._repeatCount) {
 this.reset();
 this.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;
 }
 //----------------------------------------
 }
 保存文档.此类的详细信息:
 构造函数:
 public CFTimer(delay:Number, repeatCount:Number)
 参数:
 delay:Number              ---延迟,单位毫秒.
 repeatCount:Number       ---重复次数.默认为 Infinity(正无穷大);
 方法:public reset():Void                     ---停止定时.并复位 currentCount .
 public start():Void                     ---开始计时.
 public stop():Void                     ---停止定时.
 public toString():String       ---返回类名称"[CFTimer]".
 属性:public delay:Number                                   ---延迟,单位毫秒.
 public repeatCount:Number                      ---重复的次数.默认值为 Infinity(正无穷大);
 public currentCount:Number [只读]       ---当前的次数.当开始计时,此值会递增,直到等于 repeatCount.
 public running:Boolean           [只读]       ---定时器目前的状态,true 表示正在运行, false 表示已停止.
 事件:timer = function(currentCount:Number){}              ---每当时间间隔到达 delay 时调用.
 timerComplete = function(){}                            ---当 currentCount 等于 repeatCount 时调用.
 示例类:打开 CFTimerExample.as 文档.输入下面的代码:
 import AS2.utils.CFTimer;//----------------------------------------
 class CFTimerExample
 {
 //----------------------------------------
 public function CFTimerExample()
 {
 var te:CFTimer = new CFTimer(1000, 5);
 te.timer = this.timer;
 te.timerComplete = this.timerComplete;
 te.start();
 }
 private function timer(currentCount:Number):Void
 {
 trace("timer: " + currentCount);
 }
 private function timerComplete():Void
 {
 trace("timerComplete: ");
 }
 //----------------------------------------
 }
 保存文档.这里我们创建 CFTimer 类的一个实例, 时间间隔为 1000 毫秒,重复执行 5 次.然后实现 timer 和 timerComplete 事件.
 示例 fla 文档:打开 CFTimerExample.fla 文档,将"图层 1" 重命名为 Actions.并在第一帧中输入下面的代码:
 new CFTimerExample();
 测试 Flash 文档.输出面板会陆续显示以下的内容: timer: 1timer: 2
 timer: 3
 timer: 4
 timer: 5
 timerComplete:
 下一节讲: [4.使用 addListener 方法(AsBroadcaster / BroadcasterMX 类)] 经典论坛讨论:http://bbs.blueidea.com/thread-2768209-1-1.html
 出处:蓝色理想
责任编辑:蓝色月光
 上一页 [AS2]事件处理机制 -- 创建类库 下一页 [AS2]事件处理机制 -- 使用addListener方法 一 ◎进入论坛Flash专栏版块参加讨论
	      |