解讀 LWUIT 之十三:可插拔主題(Theming)
LWUIT 開發指南下載
LWUIT 庫支援可類似於 CSS 的可插拔主題,比 Swing 要簡單一些的可插拔的外觀和感覺。
每個 LWUIT 控制項都有一個內建的 Style 對象(詳細請參閱作者的前一篇部落格《解讀 LWUIT 之十一:風格(com.sun.lwuit.plaf.Style)對象》),我們可以(在代碼中)手工操縱這個對象,也可以(使用主題配置)對這個對象進行自訂設定。例如,可以使用下面的主題將所有按鈕的背景設定為紅色:
Button.bgColor=ff0000
這個主題將按鈕對象的內建 Style 對象設定為紅色。主題可以打包為一個資源檔(詳細請參閱作者相關後續部落格),它可以在程式運行時被載入或者切換。但在主題切換後(程式運行時),我們應該使用 refreshTheme 方法來手工重新整理根控制項(根控制項指的是 Form/Dialog 等包含了我們的控制項樹的容器控制項)來更新主題,並重新整理所有控制項的內建 Style 對象。
警告:切換新主題的時候,(代碼中)手工修正的 Style 對象不會受其影響,因而不會被更新。比如,如果你(在代碼中)手工自訂了一個按鈕的背景顏色為藍色,當你載入或者切換到一個將所有按鈕顏色設定為紅色的新主題時,除了你手工定義的那個按鈕執行個體之外的所有按鈕執行個體都會受到影響。——這一點對於 LWUIT 程式員來說很爽:我們可以隨意為特殊控制項定義風格展現,而不必擔心使用主題會影響到他們。就讓主題去影響程式的整體展現效果去吧!
主題檔案的主旨非常類似於 CSS,但是主題檔案對於 LWUIT 開發人員來說更簡單,它的構造就像一個 Java 的 properties 檔案:由索引值對來定義主題檔案。其中的“鍵”起到的作用類似於 CSS 的選擇符,它表明控制項或者屬性被改變的主題的值。例如,“Button.font”就表示了所有按鈕的文本字型類型。
其中的“鍵”是由代表每一種控制項的獨一無二的標識符 ID(UUID,LWUIT 約定的控制項的 UUID 對應於該控制項類,比如 Button,Label,CheckBox,RadioButton,Form 等等。)和一個所要求的屬性類型組成,不同於 CSS 的是 LWUIT 主題不支援類似於層級選取器或更複雜的選擇符。以下是主題定義支援的屬性和它們的值的文法說明(關於邊框和透明度部分如果看不懂可以參閱作者前篇部落格《解讀
LWUIT 之十一:風格(com.sun.lwuit.plaf.Style)對象》,其中對它們進行了詳細說明):
bgAlign:定義背景圖片的對齊格式(僅僅作用於程式中沒有進行定義的背景圖片),有效值包括:BACKGROUND_IMAGE_ALIGN_TOP,BACKGROUND_IMAGE_ALIGN_BOTTOM,BACKGROUND_IMAGE_ALIGN_LEFT,BACKGROUND_IMAGE_ALIGN_RIGHT,BACKGROUND_IMAGE_ALIGN_CENTER;
bgGradient:定義圖片的漸層度,通過定義源/目的地顏色以及 X/Y 放射狀漸層來對此屬性進行設定;
bgColor:代表沒有選中控制項的背景顏色的屬性。取值只能是十六進位,比如定義為藍色時,取值為 ff;
bgImage:來自資源的一張圖片的名字,用來定義控制項的背景。所引用的圖片必須存在於資源中,其名字必須和這裡用到的一致。詳細請參閱作者後續部落格;
bgType:顧名思義,用來定義背景的類型是為圖片、顏色或者透明度。有效取值:BACKGROUND_IMAGE_SCALED,BACKGROUND_IMAGE_TILE_BOTH,BACKGROUND_IMAGE_TILE_VERTICAL,BACKGROUND_IMAGE_TILE_HORIZONTAL,BACKGROUND_IMAGE_ALIGNED,BACKGROUND_GRADIENT_LINEAR_HORIZONTAL,BACKGROUND_GRADIENT_LINEAR_VERTICAL,BACKGROUUND_GRADIENT_RADIAL;
fgColor:(對照 bgColor)代表選中的控制項的顏色的屬性。取值只能是十六進位,比如定義為紅色時,取值為 ff0000;
font:build XML 檔案中系統字型的名字;
margin:邊距,比如定義 1,2,3,4 的結果表示(此容器中的)每個控制項到上邊框為 1 個像素,到下邊框為 2 個像素,到左邊框為 3 個像素,到右邊框為 4 個像素;
padding:填充度,填充度的設定類似於邊距,但它用來更新控制項的填充度;
transparency:一個介於 0 到 255 之間的十進位數字,定義控制項背景的不透明度。0 意味著控制項的背景根本就不進行繪製(就是說完全透明),而 255 則代表此控制項的背景完全不透明。注意:此屬性設定目前為止對背景圖片無效(儘管在 LWUIT 以後的版本中可能會有效)。
必須通過 Resources 類來安裝主題,通過該類我們可以接收到已經編譯好了的包含選擇符和他們的值的雜湊表。我們可以通過 UI 管理器的 setThemeProps 方法來更新當前主題。這就是 LWUIT 的可插拔主題。
com.sun.lwuit.plaf.LookAndFeel
我們總是希望可以在一個地方控制所有控制項的繪製,並根據需要操縱它們的展現。LWUIT 將所有的繪製大權交給了一個單獨的抽象基類 LookAndFeel,我們可以通過 UIManager 來獲得它的執行個體。LookAndFeel 有一個叫做 DefaultLookAndFeel 的子類,它提供了預設的 LWUIT 展現。LookAndFeel 和 DefaultLookAndFeel 都可以被繼承,用來擴充/取代他們的具體功能。
LookAndFeel 類擁有定義控制項邊界和繪製所有控制項的方法,它還有其他一些將控制項和特殊邏輯綁定、手工繪製諸如滾動欄控制項的方法。LookAndFeel 有責任合理使用主題定義的 Style 對象,所以我們必須從主題定義中提取到控制項的 Style 對象相關配置,否則 LWUIT 將會崩潰。更多關於 com.sun.lwuit.plaf.LookAndFeel 的資訊請參閱其 API。