[翻譯]淺談Flex Framework

David Colletta
原文出處(David Coletta’s blog): 360|Flex day 2: Flex Framework with Deepa Subramaniam


此篇文章是David Coletta紀錄 360|Flex 由Deepa Subramaniam 講解Flex Framework。筆者簡單地翻譯他的文章,希望能深入淺出地道出Flex Framework的精隨。我們開始吧!

Deepa Subramaniam 道:
我們可以把Flex Framework看成一整套基礎函式庫,專門給各位Flex開發者,以後會不斷地擴充,然而我們想表達:此架構不是要作出世界上所有的UI元件讓你用;而是一組”容易擴充”的元件,使開發者容易建立屬於自己的元件。

Display list

Flash player用來放上所有可視物件的地方:Display List。整個list是樹狀結構,樹的根節點就是我們的Application(譯註:同main class ),呼叫addChild,removeChild 就是在操作display list,而SystemManager是可以取得關於字型、樣式等屬性的物件。

SystemManager

Flex Framework下,第一個實體化的物件,它最重要的任務是:建立Application並加到display list上,flex swf 是一個只有2個影格的檔案,開頭的一點程式碼已足夠實體化SystemManager,並且讓player停在第一個影格,第一個影格包含了:SystemManager、preloader還有一些東西;第二個影格是你的所有程式碼。SystemManager實體化application物件,並且把Application.systemManager指向自己,接下來,Application開始把所有的子物件建立出來,建立完成後,發出CREATION_COMPLETE事件,最後,全部完成發出APPLICATION_COMPLETE事件。
舉凡PopUp物件、ToolTip、Cursor物件也是由SystemManager管理。

FocusManager

管理元件(不是player)對鍵盤(如:tab鍵)、滑鼠動作的回應,一個app可以有多個FocusManager物件,因此可以有多個tab loop(譯註:就是按tab鍵走訪每個ui物件),本來player內建focus管理機制,flex framework覆寫掉很多以便處理ui 元件的focus回應。
系統工程師不用太琢磨FocusManager;元件開發工程師就需要:實作IFocusManagerComponent以及實作UIComponent.keyDownHandler 即可處理Focus回應,UIComponent有一個focusEnabled屬性,表示此UIComponent是否對focus做出回應,舉例來說,Label的focusEnabled 預設值是false。所有在mx.controls 下的子類別都有實作keyDownHandler。
建立可用性(accessibility)的程式時,一定要實作以上界面,然後使用flash player預設的API:flash.accessibility。我們在編譯swf時,除非需要,否則不會編譯accessiblity進去,一方面也是為了節省檔案空間。

Automate framework(mx.automation)

自動化使用者動作,並可在動作前後驗證系統狀態,所有的Flex元件都有實作automation interface(編按: 物件導向概念的interface),系統所有的物件都得加上易讀的id,這很呆,但可用,然後引入必要的automation函式庫就好;移除不使用的ui容器(譯註: container物件):

showInAutomationHierarchy=false

Moxie(Flex 3)支援”深連結”(Deep Linking),使用者操作系統時,url會因為使用的部份不同而改變(以前URL都是固定的),如同html頁面的味道,簡單來說,即Flex2 HistoryManager的進化版,不但Url會改變,也支援瀏覽器的前後鈕。我們叫它: BrowserManager。

加快程式效能

盡量避免呼叫setStyle(),這是最耗效能動作:display list上所有元件重讀樣式。如果你堅持要用,在INITIALIZE事件上呼叫,別在CREATION_COMPLETE事件做這擋事。避免建立巢狀容器,使用Canvas座標特性(譯註:Cavans上面的物件座標都是絕對的,不能動態改變),可以減少系統對物件的測量。

讓特效順暢

適當地加長特效播放的長度。如果場景上的物件越少,特效播放越順暢,避免使用點陣圖背景,加上

Effect.suspendBackgroundProcessing=true

也可以在EVENT_START EVENT_END事件處理程式裡,把背景圖隱藏起來,讓player省下繪製的效能。

Framework的存取修飾詞

public , private , protected, mx_internal
當我們瀏覽flex原始碼,我們認為你會用到的物件,標示為public,保留起來的屬性:protected,你不需要用到的:private。那mx_internal通常指,未來我們會改變的部份,可能會有bug,如果你發現了,請告訴我們: Adobe open bug base


你也可以看看Flex 開發工程師的部落格:
Ely Greenfield: quietlyscheming.com
Alex Harui: blogs.adobe.com/aharui
Gordon Smith: blogs.adobe.com/gosmith

Leave a Reply