學習筆記 FlexBuilder教程中如何使用ActionScript處理事件
FlexBuilder有很多值得學習的地方,本文和大家重點討論一下FlexBuilder教程中如何使用ActionScript處理事件,相信通過本文的學習你對FlexBuilder中ActionScript處理事件有明確的認識。
FlexBuilder教程中使用ActionScript處理事件
1,事件模型與機制
FlexBuilder教程中Flex的事件模型基于DOM3事件模型。通過創(chuàng)建注冊事件監(jiān)聽器(事件處理程序,事件處理器,是函數(shù)方法用于響應指定的事件),可以在組件的實例發(fā)出某個事件(如用戶何時與界面組件交互,以及在組件的外觀或生命周期中何時發(fā)生重要的變化,如組件的創(chuàng)建或破壞或調整其大小等)時,對象事件自動派發(fā)此事件到所有注冊過的監(jiān)聽器。
1)、事件流:
當一個事件被派發(fā)出來時,事件對象從根節(jié)點開始自上而下開始掃描displaylist(如),一直到目標對象,檢查每個節(jié)點是否有相應的監(jiān)聽器。目標對象指的是displaylist中產生事件的對象.比如:<mx:Panel><mx:HBox><mx:VBox><mx:Button/></mx:VBox></mx:HBox></mx:Panel>。如果此時resize了VBox,則會從根(Application)開始,下來檢查Panel,HBox,直到目標對象-產生resize事件的VBox為止.
2)、事件的派發(fā):
Flex中可以通過dispatchEvent()方法手工派發(fā)事件,所有UIComponent的子類都可以調用此方法.語法://參數(shù)event_type是Event對象的type屬性
//函數(shù)的返回值總是True.
objectInstance.dispatchEvent(newEvent("event_type"):Boolean
可以使用此方法派發(fā)任意事件,而不僅僅是用戶自定義事件,比如:可以派發(fā)一個Button的Click事件.varresult:Boolean=buttonInstance.dispatchEvent(newEvent(MouseEvent.CLICK));
在Flex應用中不是必須對新派發(fā)的事件進行處理,如果觸發(fā)了一個事件,而沒有對應的Listener時,Flex忽略此事件.
如果想給Event對象添加新屬性,就必須繼承Event類,然后定義新屬性
3)、事件的傳播
FlexBuilder教程中事件觸發(fā)后,Flex有3個檢測事件監(jiān)聽器的階段,3個階段的發(fā)生的順序如下:
A.捕獲階段:在捕獲階段,Flex在顯示列表中檢查事件的祖先是否注冊了事件的監(jiān)聽器.Flex從根節(jié)點開始順序而下.大多數(shù)情況中,根節(jié)點是Application對象.同時,Flex改變事件的currentTarget值.缺省情況下,在此階段,沒有容器監(jiān)聽事件.use_capture參數(shù)的值是False,在此階段添加監(jiān)聽的唯一方法是在調用add_listener時,傳入一個為True值的use_capture參數(shù),比如:myAccordion.addEventListener(MouseEvent.MOUSE_DOWN,customLogEvent,true);
如果是在Mxml中添加監(jiān)聽,Flex設置此參數(shù)為False,沒有辦法進行修改.如果設置了use_capture為True,那么事件將不會上浮.如果既想捕獲又想上浮就必須調用addEventListener兩次.一次use_capture參數(shù)為true,一次為false;捕獲很少使用,上浮的使用更為普遍.
B.目標階段:在目標階段,Flex激發(fā)事件的監(jiān)聽程序,不檢查其他的節(jié)點.
C.上浮階段:事件只在bubbles屬性為True時才進行上浮.可以上浮的事件包括:change,click,doubleClick,keyDown,keyUp,mouseDown,mouseUp.在上浮階段,Flex改變事件的currentTarget屬性,而target屬性是初始派發(fā)事件的對象.
在任意一個階段,節(jié)點們都有機會操作事件.比如:用戶點擊了一個在VBox中的Button,在捕獲階段,Flex檢查Application對象(根節(jié)點)和VBox是否有監(jiān)聽器處理此事件.Flex然后在目標階段觸發(fā)按鈕的監(jiān)聽器.在上浮階段,VBox和應用以與捕獲階段相反的順序再次獲得機會處理事件.
在Actionscript3.0中,你可以在任意目標節(jié)點上注冊事件監(jiān)聽器.但是部分事件會被直接傳給目標節(jié)點,比如Socket類.捕獲階段的節(jié)點順序是從父節(jié)點到子節(jié)點的,而上浮階段剛好相反.
捕獲事件缺省是關閉的,也就是說如果要捕獲事件,必須顯式指定在捕獲階段進行處理.
每一個Event都有target和currentTarget屬性,幫助跟蹤事件傳播的過程.
4)、查詢事件階段
FlexBuilder教程使用事件的eventPhase可以獲得事件當前的階段,
1):CAPTURE_PHASE
2):AT_TARGET
3):BUBBLING_PHASE
示例:privatefunctiondetermineState(event:MouseEvent):Void{Debug.trace(event.eventPhase+":"+event.currentTarget.id);}
5)、停止傳播
使用下面兩個函數(shù)停止事件的傳播:
stopPropagation()
stopImmediatePropagation()
2,FlexBuilder教程中如何創(chuàng)建監(jiān)聽器
組件有Flex提供的內建事件.也可以使用派發(fā)-監(jiān)聽模型定義自己的事件監(jiān)聽器,并指定監(jiān)聽器監(jiān)聽何種事件.
有三種方式:
1),內部MXML中的AS函數(shù)法:在MXML的<mx:Script></mx:Script>聲明中注冊監(jiān)聽器:這是第一個和使用最廣泛的方法,在MXML中定義事件發(fā)生時會調用的事件處理程序。
2),外部AS文件中的AS函數(shù)法:通過ActionScript定義注冊事件處理程序:可以通過使用ActionScript中的addEventHandler()等方法來注冊事件處理程序。可將addEventHandler()方法置于Application容器的creationComplete事件(在Application表單及其子級被初始化之后,在啟動應用程序時發(fā)生)的事件處理程序中。詳見ActionScript教程。
3),代碼混寫法:在MXML的控件標簽中直接完全嵌入監(jiān)聽器(這也稱為使用線上事件處理程序):這樣比較直接,代碼也較少,但會導致代碼很難閱讀、維護和縮放。如果監(jiān)聽器是多個AS語句甚至更復雜的邏輯,不推薦此方法。
【編輯推薦】
- FlexBuilder教程教你如何使用特效豐富用戶體驗
- 從Flex Builder更名看Flash平臺戰(zhàn)略
- Flex及FlexBuilder2.0開發(fā)環(huán)境詳解
- FlexBuilder3.0與Eclipse3.4的完美結合
- 學習筆記 FlexBuilder2.0中如何使用基于Lists的控件