Flex事件機制中事件處理和監(jiān)聽器注冊方法指導(dǎo)
在學(xué)習Flex的過程中,你可能會遇到Flex事件機制方面的問題,這里和大家分享一下Flex事件處理和Flex事件監(jiān)聽器注冊的概念,希望本文的介紹能讓你有所收獲。
Flex事件機制
事件處理是GUI開發(fā)的重要組成部分,早在傳統(tǒng)的Client/Server開發(fā)中,事件驅(qū)動的開發(fā)法就已經(jīng)是GUI開發(fā)的主流。
1.Flex事件處理
軟件開發(fā)者在開發(fā)過程中只關(guān)注某個組件響應(yīng)某個事件后所做的操作,即被驅(qū)動的操作,而不用像結(jié)構(gòu)化線形開發(fā)那樣去關(guān)注驅(qū)動事件的動作。響應(yīng)特定事件的組件叫做事件監(jiān)聽器(EventListener)。
一個用于交互的GUI組件會被預(yù)先定義它可能遇到的事件,軟件開發(fā)者即可根據(jù)開發(fā)需求來編寫事件監(jiān)聽器,響應(yīng)部分或全部的事件觸發(fā),圖1.7展示了這個觸發(fā)過程。作為開發(fā)者,我們首先需要了解特定的GUI交互組件支持哪些事件,之后便可以根據(jù)需求寫出相應(yīng)的事件監(jiān)聽器。
圖1.7GUI系統(tǒng)中Flex事件機制的Flex事件處理流程
在示例1.2和示例1.3中,我們已經(jīng)使用到了Flex的事件機制,F(xiàn)lex開發(fā)基于ActionScipt對象,事件已經(jīng)作為Flex可視化組件的屬性。我們可以在MXML中直接為組件的事件屬性設(shè)定事件監(jiān)聽方法或者代碼。
在示例1.2中,我們設(shè)定<mx:Button>的單擊事件(click)屬性為click=“changeText()”,并寫了一個changeText方法作為單擊事件的監(jiān)聽器。這樣,當單擊Button的時候,就會觸發(fā)Button的click事件,changeText方法將被調(diào)用。而在示例1.3中,我們把ActionScript腳本直接復(fù)制給了click,這樣整個腳本將作為一個事件監(jiān)聽器。Flex可視化組件開發(fā)的事件處理方式與HTML頁面開發(fā)中的JavaScript腳本使用是非常相似的。
如果我們需要在事件監(jiān)聽器中處理事件源,即產(chǎn)生事件的組件,那么需要為事件監(jiān)聽的方法傳遞參數(shù)event,例如可以對示例1.2中事件監(jiān)聽方法的定義和<mx:Button>的事件屬性做一些修改。
(1)事件監(jiān)聽方法定義的修改:
- publicfunctionchangeText(event:Event):void
(2)Button事件屬性的修改:
- <mx:Buttonlabelmx:Buttonlabel="點擊這里"fontSize="16"click="changeText(event)"/>
在Button事件屬性的修改中,event作為一個關(guān)鍵字來使用,而非自定義變量,因此我們可以在標簽中直接使用event來創(chuàng)建當前組件所觸發(fā)的事件對象。
ActionScript類Event構(gòu)建的時候會把事件源組件作為一個成員屬性,這樣在事件監(jiān)聽器中,我們可以通過event來操作事件源組件。
在MXML中設(shè)定事件屬性值的方式叫做事件監(jiān)聽器內(nèi)建。這種方式適合應(yīng)用在簡單的事件處理上。如果遇到需要多個事件監(jiān)聽器聯(lián)合使用等復(fù)雜的事件處理情況,則需要應(yīng)用Flex的事件注冊。
2.Flex事件機制中事件監(jiān)聽器注冊
Flex的可視化組件對象都繼承了EventDispatcher類,因此它們都支持事件注冊方法addEventListener。該方法的定義如下:
- addEventListener(type:String,listener:Function,
- useCapture:Boolean=false,priority:int=0,
- useWeakReference:Boolean=false):void
通過addEventListener方法,我們可以為可視化組件注冊一個事件監(jiān)聽器。type參數(shù)表明事件監(jiān)聽器的類型,如鼠標單擊事件(MouseEvent.CLICK);listener參數(shù)是事件監(jiān)聽器的具體方法;useCapture參數(shù)設(shè)定是否在事件的捕獲階段就進行響應(yīng);priority參數(shù)設(shè)定事件監(jiān)聽器的優(yōu)先級;useWeakReference參數(shù)設(shè)定事件監(jiān)聽器方法是否為弱類型,一個強類型的事件監(jiān)聽器方法是不會被Flex進行自動垃圾收集的。
先前我們提到的事件監(jiān)聽器內(nèi)建方式,實際上已經(jīng)創(chuàng)建了一個默認的事件監(jiān)聽器方法,并把ActionScript腳本的內(nèi)容寫入方法,但這種方法的最大不足就是無法操作一個以上的事件監(jiān)聽器。
而使用addEventListener方法注冊事件監(jiān)聽器的方式,我們可以控制事件響應(yīng)的捕獲方式和優(yōu)先級;當我們已經(jīng)添加的事件監(jiān)聽器在程序的運行過程中需要取消掉的時候,我們可以通過removeEventListener方法來實現(xiàn)。而這些功能在事件監(jiān)聽器內(nèi)建方式中不會被支持,理由也很明了:內(nèi)建的事件監(jiān)聽器都是匿名的,我們無法引用到匿名監(jiān)聽器的監(jiān)聽實體方法。
因此,在使用Flex事件機制的時候,還是應(yīng)該盡量選用事件監(jiān)聽器注冊的方式來構(gòu)建事件處理,這將為事件交互處理帶來更多的可擴展性。
【編輯推薦】
- 解析Flex事件機制中Flex事件分發(fā)和監(jiān)聽
- Flex事件機制中事件注冊通道和觸發(fā)方法
- Flex框架中Cairngorm和Mate的優(yōu)點大比拼
- FlexBuilder3.0與Eclipse3.4的完美結(jié)合
- 解析Flex應(yīng)用開發(fā)步驟 新特性和技術(shù)框架