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









夠簡單了吧,當然,這只是一個不包含任何其它處理的自定義事件。現在有人可能會問了,自定義方法中的參數有啥用,都是干哈的啊?嘿,暫時保密。
有了自定義事件,那么我們的下一個問題就來啦,自定義事件有了,那么該如何觸發,又如何監聽呢,別著急啦~~,下面就說。
在flex中,我們自定義觸發事件用的是dispatchEvent(Event),里面存放的就是我們上面提到的自定義Event事件~。系統定義的觸發事件,例如:<mx:Button id="testMs" x="71" y="295" label="Button" click = “”/>鼠標點擊的事件等等。
那么監聽的方法呢,監聽是這樣來定義的。






怕了吧,是不是參數很多,和我們平時用的有點不太一樣,我們平時,一般都是這樣用的

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








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