colin moock 寫新書 - Essential AS3
preview裏是將 EAS2裏面的 photoviewer 改寫成 AS3.0。
這代表趙英傑桑又要開始忙了嗎? ![]()
preview裏是將 EAS2裏面的 photoviewer 改寫成 AS3.0。
這代表趙英傑桑又要開始忙了嗎? ![]()
AS3除了帶來全新的DOM外,另一個大革新就是 Event Model。
以往在AS1/2裏,處理事件的方式有百百種,但基本上就是:
或是
而使用V2 components時,處理方式又變成
這些不一致性往往讓新手倍感頭痛(好吧,其實老手才更是咬牙切齒...)不知標準在那。
從AS3開始,flash的世界將只有一種Event Model,也就是V2 元件用的那種,而為了慣徹這種設計理念,整個Actionscript Class的架構都做了大改變,我們可以從下面的class tree看出來。
Object
|
+--flash.events.EventDispatcher
|
+--flash.display.DisplayObject
|
+--flash.display.InteractiveObject
|
+--flash.display.DisplayObjectContainer
|
+--flash.display.Sprite
|
+--flash.display.MovieClip
在這個架構的最上層是Object(是的,這代表下次你不知該如何cast一個物件時,仍然有個萬靈丹可惡搞,但當然這樣做要付出許多代價),下一個就是 EventDispatcher,這代表者flash裏幾乎每個物件都俱備了 dispatchEvent()的能力,因此自然也都可以用 addEventListener()來偵聽事件。
這也是為何在 flash.events.* 裏面新增了快一百多種event type 與 event class,真可說是處處是event、何處不廣播啊~
既然放了這張圖,可以順便看一下這顆樹的前面幾層,前文中提到的 Display Object與 DisplayObjectContanier都在很前面的位置,因此它們的重要性就不言可喻,此外InteractiveObject也是個重要的東西,它負責一切 Mouse, Keyboard、IME等裝置的動作偵測與廣播,從它所在的位置就可看出這次mm真的是很用心在重新設計整個架構。
AS3其它幾個重大的改變快速整理如下:
*runtime type checking + JIT compiled bytecode:
AS2之前flash只有 compiler time check, 因此許多runtime做的 type casting如果發生錯誤是沒辦法被抓出來的,只能靠自已一次次的 debug並trace每個物件來瞭解程式執行時記憶體的狀態,但現在加入了 runtime type checking後事情就變的很不一樣。
每次在 eclipse裏debug 時,只要一出現 casting error,eclipse會立刻跳到那一段並說明那裏錯誤,我故意試了幾個轉手casting的dirty trick想騙過它結果沒一個成功。
至於JIT的好處主要是在 byte code 與 native code之間的轉換,前者有體積小、可攜性高與安全的優點,但是執行效率慢(非常慢,看看JVM 1.1時的表現即知,或拿 FP7 與 FP8.5比較看看也可以),後者最主要的優點就是「快」,快到像 C++一樣的神速,這次 FP8.5全面採用 JIT bytecode後,執行效率的進步已經快到讓人驚訝(一般常見的測速結果都有 10x - 15x左右的差距)。
*32k 魔咒退卻:
以往一個class最大只能有32k, 這讓許多人得不停的把原本好好的一支class給分裂出去,才能降到 32k以下,而AS3則一口氣把這個limit拉高到 8mb,yes, 這應該是一個你永遠也沒辦法達到的上限才對,如果你能達到,代表你該把 design pattern的書拿出來再好好k一遍 Facade 跟 delegate 這兩章....(呃 Abstract Factory 跟 Command其實也要看一下)
*binary socket:
這是一個非常有趣的功能,FP8.5可以直接透過socket與各種socket server連線,最常見的socket 應用就是 email, 例如可以用 flash 寫一個 native的 pop3/smtp mail client,或是夠熱血的話可以連 NNTP, IMAP, IRC, SSH等各種應用都寫起來,目前我正在試者寫一個 pop3 client,直接透過 port 110 跟 pop3 server交談並操作,雖然對 socket programming還不是很熟悉,但仍然覺得很有趣啊~
另外伴隨 binary socket而來的就是 byteArray,這個array可以儲存 binary的資料,一般是透過socket傳回來的資料,但有趣的是它提供了一個 zlib壓縮功能,只要用:
就可以使用FP內建的 zlib 將資料壓縮,然後透過 socket傳出去,更棒的是,還記得 Flash 8裏最引人注目的 Image API嗎?現在只要透過 ByteArray.readXXX()的一系列操作,就可以將Image Data讀入 ByteArray, 然後壓縮後傳回 server,這不正是許多人夢眛以求的圖片/video上傳功能嗎?(ticore你不用再試 lzw 跟 php壓縮了,開始用 byteArray + socket才是王道啊...)
*mx.collection.*:
這個 package裏提供了兩個重要的資料結構,一個是 ICollectionView,另一個是 IList,它們將是未來AS3裏最主流的兩種資料結構(當然 Array的重要性仍然是排第一的啦),而在這裏面最重要的實作就是 ArrayCollection,簡單來講,它就是 RecordSet的繼任人選,對使用 flash remoting的人來說,recordset的重要性與必要性應該不用再解釋吧?現在既然AS3已把 recordset完全拿掉而且也不會再支援,應該是開始學ArrayCollection的時後囉~
*AMF3:
AMF(Action Media Format)是flash remoting, flashcom, local connection三者共用的 binary format,主要用來傳遞native flash object 並提供高度壓縮與自動編/解碼的功能,之前AS2使用的現在統稱為 AMF0,而AMF3自然就是專給AS3使用。
它主要的改良是在運作模式與編碼方式上,變的更有效率而且更聰明,因此可以大幅減少redundant data,這代表者傳輸速度會更快,同時應用範圍也會更廣,而且種種跡象顯示mm似乎有開放這個規格的傾向(例如在手冊中就提到 binary socket 的用途之一是透過它傳遞AMF object)。
但由於 FP8.5還在alpha階段,因此 remoting adptor這段只能靠最原始的 NetConnection自已去手動製作,當初為了成功連回 AMFPHP,可是廢了好大一翻功夫把整個 NetService, Service class都翻完才搞定,這真是回味無窮的經驗吶 -_-"
*e4x:
好吧,這個實在已經是舊聞中的舊聞了,AS3正式支援 ECMAScript For XML,you can dot down the xml document, period.
不過目前E4X 真的還在alpha的階段,執行效率只能用慘不忍睹來形容,比自已寫的 XPath還要慢,所以現在還不用期待太深。
(待續)

alright, ladies and gentlemen, let me introduce you Lab Macromedia
美國西岸時間十月十七日凌晨十二時,RIA的新時代正式開始。
macromedia在三十八鐘前開放下一代 flex builder 2 與 flash player 8.5 下載,這是macromedia有史以來第一次在產品還在開發階段就展開的public alpha, 意思是所有人現在就可以開始試試未來的玩具。
這個 public alpha為何意義重大呢?
首先,這是 flash player 8.5第一次曝露在大眾面前,而這個版本是flash有史以來最大幅度的改版,簡單來說就是整個 Actionscript Virtual Machine (以後簡稱AVM)的核心都全部改寫。
至於改寫的目地,當然就是為了支援 Actionscript 3.0 ,AS3 也同樣經歷了前所未有的大改革,全部的class package都完全改掉,同時加入了更多現代語言嚴謹的特色,使得它不論是語法、使用方式與表現都更像Java語言了。
那為何說這是一個新時代的開始呢?
答案很簡單,AS3 + FP8.5,代表的是flash正式成為一個robust enough的VM,也可以說是至此 Flash Platform終於齊備了所有商業平台所需要的要件,例如開發工具、程式語言、執行速度與效能表現,從今天之後,業界終於可以將flash pla
從今天起,我將每天一篇(或時間許可,數篇)專文介紹Flex Builder 2, Flash Player 8.5 與 Actionscript 3.0的種種細節,看完之後你就會瞭解為何我會用如此篤定的標題來型容這件事。
當然在文章還沒發表前,你可以先去下載一份軟體
試試,體驗一下全新的震撼吧
今天遇到一個小問題,我希望當scrollpane裏面的項目增加時,scrollbar能自動捲到最底部。
結果把手冊翻一遍只找到 vPosition 可以控制 scrollbar的垂直位置,但沒說該怎麼定位到最底部。
後來想想不對,既然 textarea之類的元件能用 maxVPosition 與 maxHPosition兩個屬性,那mm沒有理由不在所有List系 (List, Combobox, DataGrid, Tree, Scrollpane)組件都加入這個屬性,因此我就實驗性質的打了:
結果立刻成功,只要加上eventlisetener就可以在內容變動時自動捲動。
後來我順便用 maxVPosition 當關鍵字查了mm online doc與flashcoder,發現online doc裏仍然完全沒提,但flashcoder則有一篇討論,可見知道這招的人不多啊~(只是自動捲動不該是List元件最基本也最重要的功能之一嗎?怎麼會變成undocumented feature ?)
這次主要是修正AMF 序列化的支援度,並且加入server side resultset 的客製能力(要使用內建的 array class)。