此時我們可以通過一些方法來修改。
本文只討論外觀修改,在系統控件上進行功能擴充的自定義控件另外討論。
首先我們看下系統的RadioButton:
RadioButton長成什麼樣子是由其Background、Button等屬性決定的,Android系統
使用style定義了默認的屬性,在android源碼
android/frameworks/base/core/res/res/values/styles.xml中可以看到默認的定義:
- <style name="Widget.CompoundButton.RadioButton">
- <item name="android:background">@android:drawable/btn_radio_label_background</item>
- <item name="android:button">@android:drawable/btn_radio</item>
- </style>
即其背景圖是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,打開看其內容:
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_checked="true" android:state_window_focused="false"
- android:drawable="@drawable/btn_radio_on" />
- <item android:state_checked="false" android:state_window_focused="false"
- android:drawable="@drawable/btn_radio_off" />
- <item android:state_checked="true" android:state_pressed="true"
- android:drawable="@drawable/btn_radio_on_pressed" />
- <item android:state_checked="false" android:state_pressed="true"
- android:drawable="@drawable/btn_radio_off_pressed" />
- <item android:state_checked="true" android:state_focused="true"
- android:drawable="@drawable/btn_radio_on_selected" />
- <item android:state_checked="false" android:state_focused="true"
- android:drawable="@drawable/btn_radio_off_selected" />
- <item android:state_checked="false" android:drawable="@drawable/btn_radio_off" />
- <item android:state_checked="true" android:drawable="@drawable/btn_radio_on" />
- </selector>
定義了不同狀態下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: 灰色外框
其餘的狀態此處就不再定義。
(3)使用xml描述一個drawable
在res/drawable/創建custom_radio_btn.xml
- <?xml version="1.0" encoding="utf-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="true" android:state_checked="true" android:state_pressed="true"
- android:drawable="@drawable/enabled_on_pressed" />
- <item android:state_enabled="true" android:state_checked="false" android:state_pressed="true"
- android:drawable="@drawable/enabled_off_pressed" />
- <item android:state_enabled="true" android:state_checked="true"
- android:drawable="@drawable/enabled_on" />
- <item android:state_enabled="true" android:state_checked="false"
- android:drawable="@drawable/enabled_off" />
- <item android:state_enabled="false" android:state_checked="true"
- android:drawable="@drawable/disabled_on" />
- <item android:state_enabled="false" android:state_checked="false"
- android:drawable="@drawable/disabled_off" />
- </selector>
Item順序是有講究的,條件限定越細緻,則應該放到前面。比如這兒如果把1,2行和3,4行的item交換,那麼pressed的就永遠無法觸發了,因爲有item已經滿足條件返回了。可以理解爲代碼中的if語句。
(4)創建一個自定義的style,並應用到RaidioButton的style屬性上
- <style name="CustomRadioBtn">
- <item name="android:background">@drawable/radio_btn_bg</item>
- <item name="android:button">@drawable/custom_radio_btn</item>
- </style>
運行ap即可看到此RadioButton的外觀已經改變,此demo可以看到文字被按鈕遮蓋了一部分,
這兒是因第一步製作9patch圖片時沒有留出按鈕圖片空間來,稍作修改即可。
詳細代碼請參加最後一個附件。