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









夠簡(jiǎn)單了吧,當(dāng)然,這只是一個(gè)不包含任何其它處理的自定義事件。現(xiàn)在有人可能會(huì)問(wèn)了,自定義方法中的參數(shù)有啥用,都是干哈的啊?嘿,暫時(shí)保密。
有了自定義事件,那么我們的下一個(gè)問(wèn)題就來(lái)啦,自定義事件有了,那么該如何觸發(fā),又如何監(jiān)聽(tīng)呢,別著急啦~~,下面就說(shuō)。
在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)聽(tīng)的方法呢,監(jiān)聽(tīng)是這樣來(lái)定義的。






怕了吧,是不是參數(shù)很多,和我們平時(shí)用的有點(diǎn)不太一樣,我們平時(shí),一般都是這樣用的

后面多出的參數(shù)是什么意思呢?要想清楚知道這些,我們必須要先說(shuō)明一下flex中事件處理的流程。
在Flex中,觸發(fā)事件后,流程分為三部分,例如,我們有下面這個(gè)








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