問題:TitleWindow的關閉按鈕不好看,能否自己定制?
方法:利用Flex的皮膚機制。
環境:Flex SDK 4.6
針對Flex中TitleWindow的關閉按鈕修改問題,在前面的博文中sxy給出了一種解決方案,其主要思路是在TitleWindow上加一個關閉圖標按鈕,使其壓蓋原有的關閉按鈕。這種方法可行但存在以下兩個問題:
- 新加的關閉按鈕圖標只能疊加在原有的關閉按鈕上面,不能隨便移動其位置。
- 不能作為Flex界面定制的通用解決方案。
Flex組件的外觀都是基於皮膚機制,而皮膚可以隨意定制,換句話說Flex組件的外觀你是可以隨便修改的。這里我們以修改TitleWindow的關閉按鈕為例,探討下Flex的皮膚機制。
TitleWindow的皮膚機制
我們在Adobe Flash Builder中查看TitleWindow的源代碼(spark.components.TitleWindow),發現其繼承自Panel,而Panel最終繼承自皮膚組件類SkinnableComponent,即該類可以應用皮膚,其默認皮膚為TitleWindowSkin(spark.skins.TitleWindowSkin)。
TitleWindowSkin類控制着TitleWindow的表現形式,其中名為closeButton的Button即為關閉按鈕。其屬性width=”15” height=”15” right=”7” top=”7”表示關閉按鈕高寬都是15,距離右側7,距離頂部7,和我們看到關閉按鈕位於TitleWindow的左上角一致,修改這些屬性可以調整關閉按鈕的位置,而skinClass屬性控制着SkinClass的外觀,默認皮膚TitleWindowCloseButtonSkin。

查看TitleWindowCloseButtonSkin源碼,我們發現其樣式為X形狀,而且up, over, down, disabled四種狀態下顏色的apha值各不相同。正是基於這種機制來實現當鼠標移動到關閉按鈕、點擊關閉按鈕時關閉按鈕的不同變化。


定制關閉按鈕.
基於Flex的皮膚機制,我們來定制一個TitleWindow,主要是定制關閉按鈕closeButton。
首先新建一個組件MyTitleWindow(文件->新建->MXML組件),該組件繼承自TitleWindow。建立好后設置其skinClass屬性,指向自己定義的皮膚類MyTitleWindowSkin。

然后新建一個類MyTitleWindowSkin類(文件->新建->MXML外觀),其中主機組件選擇TitleWindow,創建以下項的副本會自動填寫為TitleWindowSkin。 
建立好MyTitleWindowSkin類后,你會發現其代碼和TitleWindowSkin的代碼完全一樣。這里我們僅僅修改closeButon,設置其skinClass屬性為MyTitleWindowCloseButtonSkin。當然你如果想調整關閉按鈕的位置,你可以修改其right,top等屬性。

最后我們來定制關閉按鈕的外觀,新建MyTitleWindowCloseButtonSkin(文件->新建->MXML外觀),主機組件選擇Button,創建以下項的副本選擇TitleWindowCloseButtonSkin。

新建好MyTitleWindowCloseButtonSkin后,基本刪除繼承來的所有代碼,然后用一個關閉圖標去替換原來的X樣式,並設置鼠標移動上去和鼠標點擊狀態下圖標不同的alpha值。

關閉圖標為:
到此為止,我們就完成了關閉按鈕的定制工作。最后將MyTitleWindow組件加到應用程序中,呈現出效果。

最終效果圖:此效果圖,除了關閉按鈕外,在MyTitleWindowSkin中對其他樣式也進行了些定制。 
小結
通過Flex的皮膚機制,我們可以完全自由地掌控組件的外觀,方便地設計出統一風格、美觀的Flex組件。
實際應用中如果僅僅修改TitleWindow等組件的一些屬性,是不用這么復雜的,畢竟這些組件本身提供了一些修改其樣式的方法。
然而如果需要定制完全個性化的組件,上文的方法比較可取。設計好幾組皮膚,以后就可以根據需要選擇使用。
