在程序開發中,Android系統控件提供的外觀往往距離我們要求的有一定差距,此時我們可以通過一些方法來修改。
本文只討論外觀修改,在系統控件上進行功能擴充的自定義控件另外討論。
首先我們看下系統的RadioButton:
RadioButton長成什麼樣子是由其Background、Button等屬性決定的,Android系統使用style定義了默認的屬性,在android源碼
android/frameworks/base/core/res/res/values/styles.xml中可以看到默認的定義:
即其背景圖是btn_radio_label_background,其button的樣子是btn_radio
btn_radio_label_background是什麼?
其路徑是android/frameworks/base/core/res/res/drawable-mdpi/btn_radio_label_background.9.png
可以看到是一個NinePatch圖片,用來做背景,可以拉伸填充。
btn_radio是什麼?
其路徑是android/frameworks/base/core/res/res/drawable/btn_radio.xml
是個xml定義的drawable,打開看其內容:
定義了不同狀態下radioButton長成什麼樣子。
如果不知道selector是什麼,就要去看下Android SDK文檔中Dev Guide->Application Resources->Resource Types。
以下面一個item為例:
<item android:state_checked="true" android:state_pressed="true"
android:drawable="@drawable/btn_radio_on_pressed" />
意思即為當radiobutton被選中時,並且被按下時,其Button應該長成btn_radio_on_pressed這個樣子。
文件是android/frameworks/base/core/res/res/drawable-mdpi/btn_radio_on_pressed.png
drawable的item中可以有以下屬性:
android:drawable="@[package:]drawable/drawable_resource"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_active=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_window_focused=["true" | "false"]
當按鈕的狀態和某個item匹配後,就會使用此item定義的drawable作為按鈕圖片。
從上面分析我們如果要修改RadioButton的外觀,那麼步驟應該是:
(1)制作一個9patch的圖片作為背景圖
准備一副PNG圖片,其中白色為透明色,是否需要透明各人根據自己需要決定。
運行SDK/tools/draw9patch
在可伸縮的范圍周圍加上黑色的線告知系統這些區域可以伸縮。
制作完的圖片,周圍多了黑色線。
(2)針對不同的狀態提供按鈕圖片
enabled, on: 紫色外框、紅色中心點
enabled, off:只有紫色外框
enabled, on, pressed:黃色外框,紅色中心點
enabled, off, pressed:黃色外框
disabled, on: 灰色外框、灰色中心點
disabled, off: 灰色外框
其余的狀態此處就不再定義。