[5.使用 addEventListener 方法(EventDispatcher 類)]
打瞌睡了吧? 貌似有口水流下來了.呵.本人文字表達(dá)能力不是很好(好像是沒吃多少書).讓大家見笑了.其實(shí)學(xué)編程 是比較悶的.不只是悶,還有很多很多,但既然選擇了,這些就只是學(xué)習(xí)途中的坎,需要我們跨過去.就像是你選擇走哪 條路一樣,既然選擇了,就必需是要走的.但這路不只是你一個(gè)人走,人多了就會(huì)有競(jìng)爭(zhēng),我們不能總走在別人后面.所 以需要加快腳步走在前面,讓后面的人去追.但有時(shí)也會(huì)在不知不覺中走彎路,我一樣也會(huì),所以在本文中如果你看到 有不正確的,希望你能指正,謝謝.此文的目的是想讓大家在這條路上能走快點(diǎn).你很啰嗦呀....呵.題外話就說到這. 下面繼續(xù).
這一節(jié)講 EventDispatcher 類.此類也是提供事件通知和偵聽器管理功能的,但比前面講的功能會(huì)強(qiáng)一些.在 AS2 中,此類用于組件的事件處理機(jī)制中.因 Macromedia 沒有過多的講解此類.很少人將它用于自定義類中.本人在研究 mx包下的類時(shí)才知道此類的用法.
首先看看在組件中如何使用: 1.
function clickHandler(evt:Object):Void { trace("click"); ] button.addEventListener("click", clickHandler); 2.
function click(evt:Object):Void { trace("click"); ] button.addEventListener("click", this); 3.
function handleEvent(evt:Object):Void { trace("click"); ] button.addEventListener("click", this); 4.
button.clickHandler = function(evt:Object) { trace("click"); } 這幾種寫法其效果都是一樣的.都是偵聽 button 實(shí)例的 click 事件.
下面來了解此類詳細(xì): public addEventListener(eventName:String, 偵聽器對(duì)象或函數(shù)):Void ---添加事件偵聽器 public removeEventListener(eventName:String, 偵聽器對(duì)象或函數(shù)):Void ---移除事件偵聽器 public dispatchEvent(eventObj:Object):Void object:Object):Void
幫助文檔中沒有講解 initialize 方法.此方法的功能同 AsBroadcaster 類的 initialize 方法一樣.
該怎么用呢? 看下面的示例: [5.1.示例: EDEventClass 類(簡(jiǎn)單的示例)] 此示例文檔詳細(xì): Example/AS2/events/EDEvent/EDEventClass.as Example/AS2/events/EDEvent/EDEventExample.as Example/AS2/events/EDEvent/EDEventExample.xml Example/AS2/events/EDEvent/EDEventExample.fla
主類: 打開 EDEventClass.as 文檔,輸入下面的代碼:
import mx.utils.Delegate; import mx.events.EventDispatcher; //---------------------------------------- class EDEventClass extends EventDispatcher { //---------------------------------------- public var tXML:XML; //---------------------------------------- public function EDEventClass(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.dispatchEvent({type:"complete"}); } } //---------------------------------------- } 如果不繼承 EventDispatcher 類.請(qǐng)將代碼改成如下:
import mx.utils.Delegate; import mx.events.EventDispatcher; //---------------------------------------- class EDEventClass { //---------------------------------------- //不繼承需添加這三個(gè)方法. public var addEventListener:Function; public var removeEventListener:Function; private var dispatchEvent:Function; //---------------------------------------- public var tXML:XML; //---------------------------------------- public function EDEventClass(url:String) { //還有使用 initialize 靜態(tài)方法. EventDispatcher.initialize(this); 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.dispatchEvent({type:"complete"}); } } //---------------------------------------- } 保存文檔. 這里首導(dǎo)入 EventDispatcher 類,你可以選擇繼承或不繼承此類.上面的代碼一個(gè)是繼承,一個(gè)是不繼承.區(qū)別 也很容易看出來.這里就不講了.
示例類: 打開 EDEventExample.as 文檔,輸入下面的代碼:
import EDEventClass; //---------------------------------------- class EDEventExample { public function EDEventExample() { var ee:EDEventClass = new EDEventClass("EDEventExample.xml"); ee.addEventListener("complete", this); } private function complete(evt:Object):Void { trace("complete"); } } 保存文檔. 在示例類中我們創(chuàng)建主類的一個(gè)實(shí)例.來加載 EDEventExample.xml 文檔.然后添加偵聽器. 如果要移除事件偵聽器,請(qǐng)使用下面的方法:
ee.removeEventListener("complete", this); 要加載的 XML 文檔: 打開 EDEventExample.xml 文檔,隨便輸入一些內(nèi)容便可.測(cè)試用.
示例 fla 文檔: 打開 EDEventExample.fla 文檔.將"圖層 1"重命名為 Actions.并在第一幀中輸入下面的代碼:
new EDEventExample(); 保存文檔. 測(cè)試 Flash 文檔.在 XML 文檔成功加載后會(huì)在輸出面板中顯示以下內(nèi)容
complete 如需給事件傳遞參數(shù),在發(fā)送事件時(shí)將參數(shù)添加事件對(duì)象(請(qǐng)看:1.事件處理機(jī)制)中,如下添加:
this.dispatchEvent({type:"complete", 參數(shù)1:"參數(shù)1", 參數(shù)2:"參數(shù)2", 參數(shù)N:"參數(shù)N"); 在調(diào)用事件時(shí):
private function complete(evt:Object) { trace([evt.type, evt.target, evt.參數(shù)1, evt.參數(shù)2, evt.參數(shù)N]); } 下面再看一個(gè)示例: [5.2.示例: EDTimer 類(定時(shí)器)] 此示例文檔詳細(xì): Classes/AS2/utils/EDTimer.as Example/AS2/utils/EDTimer/EDTimerExample.as Example/AS2/utils/EDTimer/EDTimerExample.fla
主類: 打開 EDTimer.as 類,輸入下面的代碼(當(dāng)不急時(shí),應(yīng)多打代碼(有利于鞏固知識(shí)).不應(yīng) copy/paste):
import mx.utils.Delegate; import mx.events.EventDispatcher; //------------------------------ class AS2.utils.EDTimer extends EventDispatcher { //------------------------------ 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: 重復(fù)次數(shù).默認(rèn)為Infinity(正無窮大); */ public function EDTimer(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(Delegate.create(this, this.startTimer), this._delay); this._running = true; } public function stop():Void { clearInterval(this._timerID); this._running = false; } public function toString():String { return "[EDTimer]"; } //---------------------------------------- private function startTimer():Void { this._currentCount++; this.dispatchEvent({type:"timer", currentCount:this._currentCount}); if (this._currentCount == this._repeatCount) { this.reset(); this.dispatchEvent({type:"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; } //------------------------------ } 因此類詳細(xì)前面已講,功能一樣,只是事件處理機(jī)制不同而已.這里就不再啰嗦.
示例類: 打開 EDTimerExample.as 文檔,輸入下面的代碼:
import AS2.utils.EDTimer; //---------------------------------------- class EDTimerExample { //---------------------------------------- public function EDTimerExample() { var te:EDTimer = new EDTimer(1000, 5); te.addEventListener("timer", this); te.addEventListener("timerComplete", this); te.start(); } private function timer(evt:Object):Void { trace("timer: " + evt.currentCount); } private function timerComplete(evt:Object):Void { trace(evt.type); } //---------------------------------------- } 示例 fla 文檔: 打開 EDTimerExample.fla 文檔,將"圖層 1" 重命名為 Actions.并在第一幀中輸入下面的代碼:
new EDTimerExample(); 測(cè)試 Flash 文檔.輸出面板會(huì)陸續(xù)顯示以下的內(nèi)容:
timer: 1 timer: 2 timer: 3 timer: 4 timer: 5 timerComplete 下一節(jié):[6.建立強(qiáng)大的事件處理機(jī)制]
經(jīng)典論壇討論: http://bbs.blueidea.com/thread-2768209-1-1.html
出處:藍(lán)色理想
責(zé)任編輯:藍(lán)色月光
上一頁(yè) [AS2]事件處理機(jī)制 -- 使用addListener方法 一 下一頁(yè) [AS2]事件處理機(jī)制 -- 建立強(qiáng)大的事件處理機(jī)制
◎進(jìn)入論壇Flash專欄版塊參加討論
|