【原創】Flex中事件的初探

        在flex中,Event是一個比較神奇,而且是我們必須經常打交道的一個類,黑羽大哥的一句話很經典:平生不識Event,就稱閃客也枉然,說明了Event在Flash和Flex中的地位。

        那麼這個非常重要的東西,該如何去應用呢?在這之前,我們要清楚一個事情,那就是Event是Object這個偉大父親的220多個孩子之一,也就是說,它是直接繼承於Object的。可是我們知道這有什麼用處呢,嘿~,用處大啦,因爲這代表了Event的貴族氣質,即:在Event中,級別高的控件觸發的事件,在級別低的控件中是無法被監聽到的,怎麼樣,夠高傲了吧。
        到了這裏,有人會說,這有點扯了吧,只從這個就能看出這點嗎?答案當然不是啦,原理聽小生一一道來~

        在flex中,事件分成了兩類,一個是系統事件,一個自定義事件。系統事件是包含鼠標點擊,焦點獲得等等。自定義,顧名思義,是自己定義的事件啦,但是要注意,自定義的事件必須要繼承於Event這個類,否則,listener是不會搭理你滴~。那麼自定義事件該如何定義呢,下面有一個例子,會對你有幫助。

 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);
     }
  
 }


        夠簡單了吧,當然,這只是一個不包含任何其它處理的自定義事件。現在有人可能會問了,自定義方法中的參數有啥用,都是幹哈的啊?嘿,暫時保密。

        有了自定義事件,那麼我們的下一個問題就來啦,自定義事件有了,那麼該如何觸發,又如何監聽呢,彆着急啦~~,下面就說。
        在flex中,我們自定義觸發事件用的是dispatchEvent(Event),裏面存放的就是我們上面提到的自定義Event事件~。系統定義的觸發事件,例如:<mx:Button id="testMs" x="71" y="295" label="Button" click = “”/>鼠標點擊的事件等等。
那麼監聽的方法呢,監聽是這樣來定義的。

 function addEventListener(eventName:String, //事件的KEY
                             listener:Function,   //事件的方法
                             useCapture:Boolean=false//確定偵聽器是運行於捕獲階段、目標階段還是上浮階段。
                             priority:Integer=0//優先級
                             useWeakReference:Boolean=false // 是否設定爲弱引用
                             ):


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

testMs.addEventListener(MouseEvent.CLICK,changeVboxLabel);,


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

<mx:Panel>
    
<mx:HBox>
        
<mx:VBox>
                
<mx:Button />
        
</mx:VBox>
    
</mx:HBox>
</mx:Panel>


        假設,在<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中,觸發的事件,它的底層,是無法監聽到的,收筆回家~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章