在flex中,Event是一個(gè)比較神奇,而且是我們必須經(jīng)常打交道的一個(gè)類,黑羽大哥的一句話很經(jīng)典:平生不識(shí)Event,就稱閃客也枉然,說明了Event在Flash和Flex中的地位。
那么這個(gè)非常重要的東西,該如何去應(yīng)用呢?在這之前,我們要清楚一個(gè)事情,那就是Event是Object這個(gè)偉大父親的220多個(gè)孩子之一,也就是說,它是直接繼承于Object的。可是我們知道這有什么用處呢,嘿~,用處大啦,因?yàn)檫@代表了Event的貴族氣質(zhì),即:在Event中,級(jí)別高的控件觸發(fā)的事件,在級(jí)別低的控件中是無法被監(jiān)聽到的,怎么樣,夠高傲了吧。
到了這里,有人會(huì)說,這有點(diǎn)扯了吧,只從這個(gè)就能看出這點(diǎn)嗎?答案當(dāng)然不是啦,原理聽小生一一道來~
在flex中,事件分成了兩類,一個(gè)是系統(tǒng)事件,一個(gè)自定義事件。系統(tǒng)事件是包含鼠標(biāo)點(diǎn)擊,焦點(diǎn)獲得等等。自定義,顧名思義,是自己定義的事件啦,但是要注意,自定義的事件必須要繼承于Event這個(gè)類,否則,listener是不會(huì)搭理你滴~。那么自定義事件該如何定義呢,下面有一個(gè)例子,會(huì)對(duì)你有幫助。
import flash.events.Event;
public class MyEvent extends Event

{

public function MyEvent (type:String, nextPage:String, bubbles:Boolean = false, cancelable:Boolean = false)
{
super(type, bubbles, cancelable);
}
}

夠簡單了吧,當(dāng)然,這只是一個(gè)不包含任何其它處理的自定義事件。現(xiàn)在有人可能會(huì)問了,自定義方法中的參數(shù)有啥用,都是干哈的啊?嘿,暫時(shí)保密。
有了自定義事件,那么我們的下一個(gè)問題就來啦,自定義事件有了,那么該如何觸發(fā),又如何監(jiān)聽呢,別著急啦~~,下面就說。
在flex中,我們自定義觸發(fā)事件用的是dispatchEvent(Event),里面存放的就是我們上面提到的自定義Event事件~。系統(tǒng)定義的觸發(fā)事件,例如:<mx:Button id="testMs" x="71" y="295" label="Button" click = “”/>鼠標(biāo)點(diǎn)擊的事件等等。
那么監(jiān)聽的方法呢,監(jiān)聽是這樣來定義的。
function addEventListener(eventName:String, //事件的KEY
listener:Function, //事件的方法
useCapture:Boolean=false, //確定偵聽器是運(yùn)行于捕獲階段、目標(biāo)階段還是上浮階段。
priority:Integer=0, //優(yōu)先級(jí)
useWeakReference:Boolean=false // 是否設(shè)定為弱引用
):
怕了吧,是不是參數(shù)很多,和我們平時(shí)用的有點(diǎn)不太一樣,我們平時(shí),一般都是這樣用的
testMs.addEventListener(MouseEvent.CLICK,changeVboxLabel);,
后面多出的參數(shù)是什么意思呢?要想清楚知道這些,我們必須要先說明一下flex中事件處理的流程。
在Flex中,觸發(fā)事件后,流程分為三部分,例如,我們有下面這個(gè)
<mx:Panel>
<mx:HBox>
<mx:VBox>
<mx:Button />
</mx:VBox>
</mx:HBox>
</mx:Panel>

假設(shè),在<mx:VBox>中觸發(fā)一個(gè)事件。事件的觸發(fā)順序是這樣的,先捕捉,然后目標(biāo),最后上浮。
捕捉:在我們剛才的假設(shè)中,首先觸發(fā)器會(huì)按<mx:Panel>-><mx:HBox>-><mx:VBox>這個(gè)順序來檢查每個(gè)節(jié)點(diǎn).這個(gè)階段,我們稱為捕捉階段,在addEventListener的構(gòu)造函數(shù)中,我們默認(rèn)是不監(jiān)聽這個(gè)階段的。
目標(biāo):顧名思義,就是<mx:VBox>這個(gè)觸發(fā)事件的節(jié)點(diǎn)。
上浮:<mx:VBox>-><mx:HBox>-><mx:Panel>是按照這個(gè)順來檢查每個(gè)節(jié)點(diǎn)是否注冊(cè)了監(jiān)聽。
了解了Flex中事件的處理流程,那么我們可以解釋addEventListener三個(gè)參數(shù)的意義啦。
useCapture:Boolean=false,表示的,這個(gè)監(jiān)聽是能在目標(biāo)階段和上浮階段進(jìn)行監(jiān)聽
useCapture:Boolean=true,表示的是這個(gè)監(jiān)聽只能在捕捉階段進(jìn)行監(jiān)聽。
priority:Integer=0, 優(yōu)先級(jí),監(jiān)聽是有優(yōu)先級(jí)的,那么通過這個(gè)字段,我們可以輕松的改變監(jiān)聽的優(yōu)先級(jí),是不是很方便,默認(rèn)的時(shí)候?yàn)?;
useWeakReference:Boolean=false // 是否設(shè)定為弱引用 這個(gè)參數(shù)的意思是,在該監(jiān)聽不使用的時(shí)候,是否允許垃圾回收器,將該監(jiān)聽回收。這個(gè)很重要,因?yàn)閍ddEventListener有點(diǎn)類似千年老龜,生命周期比較長,如果沒有被回收掉,會(huì)一直占著系統(tǒng)資源的。
最后有一點(diǎn),要非常注意,在UI的監(jiān)聽執(zhí)行完畢后,一定要將該監(jiān)聽移除removeEventListener,否則,即使UI被移除掉,監(jiān)聽也不會(huì)被銷毀。這個(gè)比較重要,因?yàn)橐恍┛雌饋肀容^詭異的錯(cuò)誤,大部分是因?yàn)檫@個(gè)導(dǎo)致的。
現(xiàn)在來解惑先前的埋伏下的懸念:
MyEvent (type:String, bubbles:Boolean = false, cancelable:Boolean = false)
bubbles:Boolean = false:這個(gè)事件是否參與上浮階段
cancelable:Boolean = false // 確定是否可以取消 Event 對(duì)象
所以,在application中,觸發(fā)的事件,它的底層,是無法監(jiān)聽到的,收筆回家~