JAVA & FLEX

          一個(gè)分享java和flex開(kāi)發(fā)經(jīng)驗(yàn)的空間

             :: 首頁(yè) ::  :: 聯(lián)系 ::  :: 管理 ::
            26 隨筆 :: 2 文章 :: 44 評(píng)論 :: 0 Trackbacks

                  在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ì)你有幫助。

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


                  夠簡(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)定義的。

           function addEventListener(eventName:String, //事件的KEY
                                       listener:Function,   //事件的方法
                                       useCapture:Boolean=false//確定偵聽(tīng)器是運(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ù)是什么意思呢?要想清楚知道這些,我們必須要先說(shuō)明一下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è)順序來(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)到的,收筆回家~

          posted on 2008-08-07 15:31 程序人生-天津 閱讀(2916) 評(píng)論(0)  編輯  收藏 所屬分類: Flex
          主站蜘蛛池模板: 南川市| 临高县| 甘德县| 扶沟县| 财经| 龙门县| 邮箱| 平乡县| 湘阴县| 蓬莱市| 炎陵县| 文登市| 兴仁县| 天全县| 石林| 盖州市| 翁牛特旗| 太湖县| 肃宁县| 通州区| 乃东县| 莱芜市| 松原市| 陇南市| 郑州市| 河东区| 铜梁县| 固阳县| 云浮市| 廊坊市| 洛阳市| 和田市| 辉南县| 华安县| 屏山县| 榆中县| 卓资县| 张家川| 南宫市| 盱眙县| 舒兰市|