1. 程式人生 > >AS3.0:強大的事件機制(上)

AS3.0:強大的事件機制(上)

回顧和比較
AS1.0玩家最愛用onClipEvent(), on(),又方便又直接。缺點在於邏輯分散到了各個舞臺元件中,難以管理和維護。更加別說程式碼重用了。別跟俺說可以Copy, Paste,這不叫重用,這叫低階。
AS2.0中,增加了一些事件處理機制:
1.回撥函式: onLoad, onComplete等。相信兄弟們最熟悉的應該就是XML.onload回撥函數了。
2.事件偵聽器型:
這個就是addListener(), addEventListener()這種型別的。傳送事件有的是內建,有的通過dispatchEvent().
嗯,這種事件機制基本上就和AS3.0很像了。自從使用了ActionScript 2.0來開發專案,

黑羽就儘可能的多用這種事件處理機制。這個習慣很好,基本上讓黑羽對3.0的機制很快適應過來。
說道這裡,黑羽要多扯幾句2.0,抱怨一下它的不足,再讓大家看看AS3.0的光明大道。

(1).2.0中除了UIComponent能自己傳送事件,絕大部分類不能自己傳送事件的,比如MovieClip, 或者一些自定義的類。黑羽還製作了一個EventSender的事件傳送類來解決。
當然你可以通過擴充套件來解決MovieClip這些類來解決,但是在一些輕量級或者特殊運用中,還是用黑羽這個EventSender類更加方便。
比如說,你突然需要舞臺上某個A_mc的執行到第20幀時傳送一個"finished"事件出來,並且希望另外某個B_mc能夠捕捉到這個事件,那麼用一般的擴充套件方法不知道有多麼麻煩!
(1.要重做一個帶有事件傳送功能的類和A_mc通過某種方式繫結。2.同時確保在B_mc中要能訪問到傳送事件的物件並addEventListenr)。
而用俺的EventSender類非常簡單,A_mc中寫 EventSender.send("finished", this), B_mc中寫EventSender.addListener("finished", listenerFunc),並可以通過event.target屬性直接定位A_mc,真是簡單的不能再簡單了。(請儘量以正規方法為主,不推薦頻繁使用,不是好的程式設計習慣)
laughing.gif

(2)2.0中,偵聽器的記憶是"有毛病"的。如果是新手,會經常覺得偵聽器函式的this關鍵字指向飄忽不定,常常弄錯。而且看看高手的程式碼,一會兒是Object做偵聽器,一會兒是function做偵聽器,真是讓人頭痛。其實MacroMedia也很頭痛,所以就出了Delegate這個官方類(補丁?)來解決這些問題。

(3)偵聽器註冊方式也有兩種,一種是addListener(),如Key,一種是addEventListener(),如UIComponent類。為什麼要這樣搞兩種?MacroMedia無辜的望著我,喃喃道偶也不完全清楚。

超人來了,那就是ActionScript 3.0事件處理機制:
(1)統一。全部一色用addEventListener().
(2)所有的可視物件都可以接受和傳送事件。
AS3.0的類繼承設計是深思熟慮的,所有的可視物件所屬類都是DisplayObject的子類, DisplayObject又是EventDispatcher的子類。因此它們就都可以玩Event了,所以說,有個好的老子就是好啊。
而且有了嶄新的事件冒泡機制,可以使事件層層上遞到最上層的Stage,絕好的功能!
有了以上兩點:

黑羽的EventSender類也可以歇菜了。
(3)偵聽器統一使用Function,不再使用Object了。 同時this關鍵字的記憶力“大大增強”,Delegate類也可以下崗了。

Event涉及到的內容極多,面很廣。下面黑羽將從以下幾個方面講起:
一、如何接收事件?如何做到AS3.0的標準事件程式設計。
二、如何傳送自定義事件?如何在OOP中正確使用AS3.0強大靈活的事件架構。
三種方式及其優劣,以及在何種情況下使用。
(1)用繼承EventDispatcher實現
(2)用複合EventDispatcher例項來實現。
(3)用介面IEventDispatcher實現
三、如何使用冒泡機制(即官方所稱的Event Flow機制)?以及冒泡機制的原理。
四、Event的其他高階應用。
P.S:本教程受Creative Commons License.協議保護,轉至:www.kingda.org未經作者同意,不得用於商業用途。