歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 自定義控件外觀

Android 自定義控件外觀

日期:2017/3/1 10:48:40   编辑:Linux編程

在程序開發中,Android系統控件提供的外觀往往距離我們要求的有一定差距,此時我們可以通過一些方法來修改。

本文只討論外觀修改,在系統控件上進行功能擴充的自定義控件另外討論。

首先我們看下系統的RadioButton:

RadioButton長成什麼樣子是由其Background、Button等屬性決定的,Android系統使用style定義了默認的屬性,在android源碼

android/frameworks/base/core/res/res/values/styles.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,打開看其內容:

  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. <item android:state_checked="true" android:state_pressed="true"
  7. android:drawable="@drawable/btn_radio_on_pressed" />
  8. <item android:state_checked="false" android:state_pressed="true"
  9. android:drawable="@drawable/btn_radio_off_pressed" />
  10. <item android:state_checked="true" android:state_focused="true"
  11. android:drawable="@drawable/btn_radio_on_selected" />
  12. <item android:state_checked="false" android:state_focused="true"
  13. android:drawable="@drawable/btn_radio_off_selected" />
  14. <item android:state_checked="false" android:drawable="@drawable/btn_radio_off" />
  15. <item android:state_checked="true" android:drawable="@drawable/btn_radio_on" />
  16. </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: 灰色外框

其余的狀態此處就不再定義。

Copyright © Linux教程網 All Rights Reserved