[3.使用 回調(diào)函數(shù)]
回調(diào)函數(shù)也可以說是匿名函數(shù),先看下面的代碼:
var myXML:XML = new XML(); myXML.load("xml.xml"); myXML.onLoad = function(success:Boolean) { trace(success); }
XML.onLoad 是一個回調(diào)函數(shù).將匿名函數(shù)與特定的事件關聯(lián),以創(chuàng)建回調(diào)函數(shù).函數(shù)將在特定事件發(fā)生后調(diào)用回調(diào)函數(shù). 在自定義類中怎么做呢?看下面的示例.
[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; //定義事件函數(shù). 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) { //執(zhí)行事件函數(shù). this.complete(); } } //---------------------------------------- }
保存文檔,這樣我們就創(chuàng)建了一個名為 CFEventClass 的類,擁有一個事件,一個屬性,此事件在 XML 文檔成功加載后發(fā)生.
示例類: 打開 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"); } }
保存文檔. 在示例類中我們創(chuàng)建主類的一個實例.來加載 CFEventExample.xml 文檔.然后使用自定義函數(shù)與 complete 事件關聯(lián). 如果要移除事件,請使用下面的方法:
ee.complete = undefined //或 ee.complete = null; //或 delete ee.complete;
要加載的 XML 文檔: 打開 CFEventExample.xml 文檔,隨便輸入一些內(nèi)容便可.測試用.
示例 fla 文檔: 打開 CFEventExample.fla 文檔.將"圖層 1"重命名為 Actions.并在第一幀中輸入下面的代碼:
new CFEventExample();
保存文檔. 測試 Flash 文檔.在 XML 文檔成功加載后會在輸出面板中顯示以下內(nèi)容
complete
如需給事件傳遞參數(shù),在執(zhí)行事件函數(shù)時如下添加參數(shù):
this.complete(參數(shù)1, 參數(shù)2, 參數(shù)N);
在調(diào)用事件時:
private function complete(參數(shù)1, 參數(shù)2, 參數(shù)N) { trace([參數(shù)1, 參數(shù)2, 參數(shù)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: 重復的次數(shù).默認為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; } //---------------------------------------- }
保存文檔. 此類的詳細信息: 構造函數(shù): public CFTimer(delay:Number, repeatCount:Number) 參數(shù): delay:Number ---延遲,單位毫秒. repeatCount:Number ---重復次數(shù).默認為 Infinity(正無窮大);
方法: public reset():Void ---停止定時.并復位 currentCount . public start():Void ---開始計時. public stop():Void ---停止定時. public toString():String ---返回類名稱"[CFTimer]".
屬性: public delay:Number ---延遲,單位毫秒. public repeatCount:Number ---重復的次數(shù).默認值為 Infinity(正無窮大); public currentCount:Number [只讀] ---當前的次數(shù).當開始計時,此值會遞增,直到等于 repeatCount. public running:Boolean [只讀] ---定時器目前的狀態(tài),true 表示正在運行, false 表示已停止.
事件: timer = function(currentCount:Number){} ---每當時間間隔到達 delay 時調(diào)用. timerComplete = function(){} ---當 currentCount 等于 repeatCount 時調(diào)用.
示例類: 打開 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: "); } //---------------------------------------- }
保存文檔. 這里我們創(chuàng)建 CFTimer 類的一個實例, 時間間隔為 1000 毫秒,重復執(zhí)行 5 次.然后實現(xiàn) timer 和 timerComplete 事件.
示例 fla 文檔: 打開 CFTimerExample.fla 文檔,將"圖層 1" 重命名為 Actions.并在第一幀中輸入下面的代碼:
new CFTimerExample();
測試 Flash 文檔.輸出面板會陸續(xù)顯示以下的內(nèi)容:
timer: 1 timer: 2 timer: 3 timer: 4 timer: 5 timerComplete:
下一節(jié)講: [4.使用 addListener 方法(AsBroadcaster / BroadcasterMX 類)]
經(jīng)典論壇討論: http://bbs.blueidea.com/thread-2768209-1-1.html
出處:藍色理想
責任編輯:藍色月光
上一頁 [AS2]事件處理機制 -- 創(chuàng)建類庫 下一頁 [AS2]事件處理機制 -- 使用addListener方法 一
◎進入論壇Flash專欄版塊參加討論
|