android系統 按鈕樣式

在程序開發中,android系統控件提供的外觀往往距離我們要求的有一定差距, 
此時我們可以通過一些方法來修改。 
本文只討論外觀修改,在系統控件上進行功能擴充的自定義控件另外討論。 

首先我們看下系統的RadioButton: 
RadioButton長成什麼樣子是由其Background、Button等屬性決定的,Android系統 
使用style定義了默認的屬性,在android源碼 
android/frameworks/base/core/res/res/values/styles.xml中可以看到默認的定義: 
Xml代碼  收藏代碼
  1. <style name="Widget.CompoundButton.RadioButton">  
  2.         <item name="android:background">@android:drawable/btn_radio_label_background</item>  
  3.         <item name="android:button">@android:drawable/btn_radio</item>  
  4. </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,打開看其內容: 
Xml代碼  收藏代碼
  1. <selector xmlns:android="http://schemas.android.com/apk/res/android">      
  2.     <item android:state_checked="true" android:state_window_focused="false"  
  3.           android:drawable="@drawable/btn_radio_on" />  
  4.     <item android:state_checked="false" android:state_window_focused="false"  
  5.           android:drawable="@drawable/btn_radio_off" />  
  6.   
  7.     <item android:state_checked="true" android:state_pressed="true"  
  8.           android:drawable="@drawable/btn_radio_on_pressed" />  
  9.     <item android:state_checked="false" android:state_pressed="true"  
  10.           android:drawable="@drawable/btn_radio_off_pressed" />  
  11.   
  12.     <item android:state_checked="true" android:state_focused="true"  
  13.           android:drawable="@drawable/btn_radio_on_selected" />  
  14.     <item android:state_checked="false" android:state_focused="true"  
  15.           android:drawable="@drawable/btn_radio_off_selected" />  
  16.   
  17.     <item android:state_checked="false" android:drawable="@drawable/btn_radio_off" />  
  18.     <item android:state_checked="true" android:drawable="@drawable/btn_radio_on" />  
  19. </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代碼  收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <item android:state_enabled="true" android:state_checked="true" android:state_pressed="true"  
  4.           android:drawable="@drawable/enabled_on_pressed" />  
  5.             
  6.     <item android:state_enabled="true" android:state_checked="false" android:state_pressed="true"  
  7.           android:drawable="@drawable/enabled_off_pressed" />  
  8.   
  9.     <item android:state_enabled="true" android:state_checked="true"  
  10.           android:drawable="@drawable/enabled_on" />  
  11.             
  12.     <item android:state_enabled="true" android:state_checked="false"  
  13.           android:drawable="@drawable/enabled_off" />  
  14.             
  15.     <item android:state_enabled="false" android:state_checked="true"  
  16.           android:drawable="@drawable/disabled_on" />  
  17.             
  18.     <item android:state_enabled="false" android:state_checked="false"  
  19.           android:drawable="@drawable/disabled_off" />                
  20. </selector>  

Item順序是有講究的,條件限定越細緻,則應該放到前面。比如這兒如果把1,2行和3,4行的item交換,那麼pressed的就永遠無法觸發了,因爲有item已經滿足條件返回了。可以理解爲代碼中的if語句。 
(4)創建一個自定義的style,並應用到RaidioButton的style屬性上 
Xml代碼  收藏代碼
  1. <style name="CustomRadioBtn">  
  2.         <item name="android:background">@drawable/radio_btn_bg</item>  
  3.         <item name="android:button">@drawable/custom_radio_btn</item>  
  4. </style>  


運行ap即可看到此RadioButton的外觀已經改變,此demo可以看到文字被按鈕遮蓋了一部分, 
這兒是因第一步製作9patch圖片時沒有留出按鈕圖片空間來,稍作修改即可。 
 

詳細代碼請參加最後一個附件。 
發佈了37 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章