JAVA & FLEX

          一個分享java和flex開發經驗的空間

             :: 首頁 ::  :: 聯系 ::  :: 管理 ::
            26 隨筆 :: 2 文章 :: 44 評論 :: 0 Trackbacks

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

          posted on 2008-08-07 15:31 程序人生-天津 閱讀(2917) 評論(0)  編輯  收藏 所屬分類: Flex
          主站蜘蛛池模板: 乐亭县| 宜兰市| 崇阳县| 洪雅县| 多伦县| 岢岚县| 商水县| 张家口市| 田阳县| 比如县| 安国市| 屯留县| 深州市| 永年县| 东宁县| 武邑县| 乌兰县| 高邑县| 天祝| 阿坝县| 北海市| 宝山区| 屏边| 新密市| 伊金霍洛旗| 松滋市| 永修县| 布尔津县| 芦山县| 辛集市| 灵山县| 天水市| 邹城市| 乐至县| 探索| 勃利县| 友谊县| 景德镇市| 加查县| 延安市| 中西区|