定義屬性
開發者通常希望"消息"能夠攜帶更多的信息,提供更多的數據。在自定義事件中,通過定義屬性,可以讓事件攜帶更多的信息。
編寫構造器
類當然離不開構造器。事件類的構造器要完成兩項任務。
?。?). 調用Super()
通過Super()調用父類的構造器,以初始化從父類繼承的屬性等。通常情況下,子類構造器應該首先調用Super()方法。當然,如果沒有為子類編寫構造器(不添加構造器方法),編譯器會自動添加一個構造器,并且也會調用Super()。但是,我們仍然推薦編寫構造器,并且顯式地調用Super()方法。
(2). 設置屬性
事件類型是最常用到的事件屬性。Super()可以接受String類型的參數,由此設置父類事件中繼承來的事件類型屬性(event.type)。
除了事件類型外,事件的其他自定義屬性可以作為構造器的參數傳入,在構造器中完成初始化。更靈活的是,這些屬性類型不僅僅局限于String、Number等基本類型,還可以是任何自定義類。
重載clone方法
創建自定義事件的最后一步是重載父類的clone方法,返回新的Event對象。當觸發事件時,即dispatchEvent(event)時,EventDispatcher會自動調用clone方法獲取新的Event對象。
重載clone方法將復制自定義類的所有屬性。如果你沒有對自定義事件類中添加的所有屬性進行賦值的話,那么當偵聽器處理觸發的自定義事件時,就不會獲得正確的屬性值。
2.使用元數據[Event]定義事件
通過[Event]元數據,開發者可以為組件定義事件。編譯器能夠把這些自定義的事件識別為MXML標簽屬性。使用[Event]既可以為ActionScript組件定義事件,也可以為MXML組件定義事件。
為ActionScript組件定義事件
為MXML組件定義事件
3.觸發事件
4.創建事件偵聽器
Flex的事件可以分為系統事件和用戶事件。
由用戶操作觸發的事件,就是用戶事件。Flex的用戶事件遵循了W3C DOM Level3(W3C文檔對象模型Level3)事件規范。具體可參見http://www.w3.org/TR/DOM-Level-3-Events/ 。用戶事件是應用中最常見的事件類型,比如鼠標點擊、鍵盤輸入等都屬于用戶事件。除了用戶直接觸發的事件,在Flex應用運行過程中,Flex架構本身也會自動觸發一些事件,也就是所謂的系統事件。在信號燈應用中,creationComplete事件是系統事件,而MouseEvent.CLICK事件則是用戶事件。
所有的Flex可視化組件都繼承自基類mx.core.UIComponent,同時也繼承了UIComponent的系統事件。當Flex應用啟動時,會觸發一系列事件,這些事件表明了組件在啟動過程中的不同時間點,比如被創建、布局完成或者在屏幕上完成繪制等。這些啟動序列事件幫助開發者更好的監控并控制應用運行生命周期的各個環節。實際上,這"一系列"事件都由一個事件類mx.events. FlexEvent表示。FlexEvent類的不同類型反映了啟動過程中不同階段發生的事件。
在Flex應用中,容器和組件啟動時的事件序列不同。
在組件所屬的容器內,組件被實例化、加入到父容器的顯示列表中,然后設置外觀尺寸,最終完成容器中的布局,并被繪制出來。圖3-1顯示了組件的啟動事件序列:
由于容器包含了子組件,因此容器啟動時的序列不同于單一組件,圖3-2顯示了包含子組件的容器的啟動過程。不僅容器本身要完成創建的全過程,所包含的子組件也要依次序地完成自身的創建。當然如果容器中嵌入了子容器,其啟動過程與此類似。
圖3-2
Flex應用啟動的事件序列(2)
在所有組件和容器被創建并最終繪制在屏幕上之后,Application對象將觸發applicationComplete事件,該事件類型標志著應用啟動完畢,是應用啟動時觸發的最后一個事件。
圖3-2中描述的部分啟動序列事件解釋如下:
preinitialize:在初始化之前觸發,對于容器來說,所有子組件尚未定義。一般來說,不會在該事件觸發時配置組件;
initialize:當組件或容器完成構造,并設置初始化屬性后觸發。在這個階段,對于容器,其所有的子組件的preinitialize事件已經觸發,但是這些子組件還沒有完成布局;
creationComplete:當應用或組件(包括所有子組件)完成構造、布局和繪制可見時觸發。當creationComplete事件發生時,組件已經被創建出來,因此開發者也能夠訪問同組件相關的屬性,比如height、width等屬性。開發者通常使用這個事件來對應用進行初始化配置。比如為某些應用組件添加偵聽器,調用Web服務等;
applicationComplete:所有的組件初始化完成并顯示。
如我們剛才提到的,在事件被觸發后,Flash Player就會創建事件對象,并逐一檢查"事件旅程"上的節點是否針對發生的事件注冊了偵聽器,為事件對象賦值,并調用偵聽器。事件對象源自flash.events.Event類。事件對象currentTarget屬性的值會在事件流中改變,而target屬性則不會變化。(關于事件對象,我們將在6.3節(見第106頁)深入討論)由此,開發者能夠通過
currentTarget屬性獲知事件旅程現在停在了哪個節點上。
currentTarget屬性:事件旅程中,currentTarget屬性代表了Flash Player正在檢查的節點對象。比如,當Flash Player遍歷到ctnButtons對象,那么event.currentTarget就是ctnButtons對象。
target屬性:target屬性就是發生事件的對象。在信號燈應用中,event.target就是用戶所點擊的按鈕對象,在事件旅程中,該屬性的值始終不變。信號燈應用中,偵聽器myEventHandler利用event.target來獲取被點擊按鈕上的標簽數據。此時賦給event.currentTarget屬性的則是HBox容器對象ctnButtons。
2. type屬性(String類型)
當用戶進行鼠標操作時,Flash Player會自動調度鼠標事件MouseEvent。操作可能是鼠標點擊、移動、滑動滾輪等。這些不同的操作都是通過事件類型來標記的。
type屬性返回的字符串表明事件的類型。代表事件類型的字符串是大小寫敏感的。Flex以常量的形式內置了許多事件類型,如Event.unloaded和MouseEvent.CLICK。
3. cancellable屬性(String類型)和preventDefault()方法
默認情況下,許多事件都有 Flash Player 執行的關聯行為。比如,如果用戶在文本字段中鍵入一個字符,則默認行為就是在文本字段中顯示該字符。如果需要取消TextEvent.TEXT_INPUT事件的默認行為,你可以使用preventDefault()方法來阻止顯示所鍵入的字符。
不可取消行為的一個示例是與Event.REMOVED事件關聯的默認行為,只要Flash Player從顯示列表中刪除顯示對象,就會生成該事件。由于無法取消默認行為(刪除元素),因此preventDefault()方法對此默認行為無效。
開發者可以使用Event.cancelable屬性來檢查是否可以阻止與特定事件關聯的默認行為。如果屬性Event.cancelable的值為true,則可以使用preventDefault()來取消默認行為,否則,preventDefault()無效。