狀態列表
StateListDrawable一個被定義在XML中的可繪制對象,它依賴對象的狀態,使用不同的圖片來代表同一個圖形。如,一個Button能夠存在幾種不同狀態中的一種(如按下、聚焦或者都不是),通過使用狀態列表,能夠給每種狀態提供不同的背景圖片。
能夠在一個XML文件中描述狀態列表,每個圖形都用一個<item>元素來代表,它們被放在<selector>元素內。每個<item>使用各種屬性來描述圖形被繪制時要使用那個狀態。
在狀態改變期間,狀態列表會從上到下被遍歷,並且會使用到第一個匹配的項目,然後遍歷終止,選擇不是基於最優匹配規則。
文件位置(FILE LOCATION):
res/drawable/filename.xml
filename被用於資源ID。
被編譯資源的數據類型(COMPILED RESOURCE DATATYPE)
資源指向一個StateListDrawable對象。
資源引用(RESOURCE REFERENCE):
在Java代碼中:R.drawable.filename
在XML中:@[package:]drawable/filename
語法(SYNTAX):
<?xml version="1.0" encoding="utf-8"?>
<selectorxmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize=["true" | "false"]
android:dither=["true" | "false"]
android:variablePadding=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_hovered=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_activated=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>
元素(ELEMENTS):
<selector>
必須的,它必須是根元素。要包含一個或多個<item>元素。
屬性(ATTRIBUTES):
xmlns:android
字符串值,必須的。它定義瞭XML的命名空間,必須是http://schemas.android.com/apk/res/android
android:constantSize
一個佈爾值,如果設置為true,那麼繪制資源要報告內部尺寸,並把這個尺寸作為狀態改變的常量(這個尺寸是所有狀態中最大的那個);否則會基於當前狀態來進行尺寸的變化,默認是false。
android:dither
一個佈爾值,如果設置為true,那麼會啟用位圖仿色處理,否則會禁用仿色處理,默認是true。
android:variablePadding
一個佈爾值,如果設置為true,繪制資源的邊距應該基於當前被選擇的狀態來改變,否則邊距應該保持相同(基於所有狀態中最大邊距的那個)。啟用這個功能需要自己處理狀態變化時的佈局,因此經常不支持這麼設置。默認設置時false。
<item>
定義用於某個確定狀態的繪制資源,這個資源是通過它的屬性來描述的。它必須是<selector>元素的一個子元素。
屬性(ATTRIBUTES):
android:drawable
繪制資源,必須的。它指向要引用的可繪制資源。
android:state_pressed
一個佈爾值,如果設置為true,那麼這個項目應該在對象被按下時使用(如,當按鈕被觸摸或點擊時)。否則這個項目會用於默認的非按下狀態。
android:state_foucused
一個佈爾值,如果設置為true,那麼這個項目應該在對象有輸入焦點時被使用(如用戶選擇瞭一個文本輸入域);否則,這個項目應用被用於默認的非焦點狀態。
android:state_houvered
一個佈爾值,如果設置為true,那麼這個項目應該在光標懸停在對象之上時被使用,否則應該使用默認的非懸停狀態。通常,這個繪制資源會使用與“聚焦”狀態相同的資源。
這個狀態在API級別14中被引入。
android:state_selected
一個佈爾值,如果設置為true,那麼這個項目應該在用戶選擇瞭一個導航控件時使用(如,用方向板在一個列表中導航);如果設置為false,那麼在對象沒有被選擇時這個項目就不應該使用這個狀態。
當聚焦狀態(android:state_focused)不滿足需要時,要使用選擇狀態(如當列表視圖有焦點,並且用導向板選擇列表中的項目時)。
android:state_checkable
一個佈爾值,如果設置為true,那麼當對象是可被復選的時候,應該使用這個項目,否則這個對象不能被復現。(它僅在對象在可選和不可選之間變換時才有用)。
android:state_checked
一個佈爾值,如果設置為true,那麼這個項目應用在對象被復選時使用;否則應該使用於非復選狀態。
android:state_enabled
一個佈爾值,如果設置為true,那麼這個項目應用於對象啟用狀態(接收觸摸或點擊事件的能力),否則應該用於禁用狀態。
android:state_activated
一個佈爾值,如果設置為ture,那麼這個項目應該在對象被持久選擇時使用(如對象的高亮狀態),否則應該在對象沒有被激活時使用這個狀態。
android:state_window_focused
一個佈爾值,如果設置true,那麼這個項目應該在應用程序窗口有焦點時被使用(應用程序是在前臺)。否則應該用於應用程序窗口沒有焦點時的狀態(如,通知欄被來下或對話框顯示的時候)。
註意:要記住,Android會使用狀態列表中第一個與當前狀態匹配的項目,因此,如果列表中第一個項目沒有包含以上介紹的任何一個屬性,那麼在任何時候都會使用這個項目,這就是為什麼要它放到列表的最後的原因。
列子(EXAMPLE):
XML文件被保存在res/drawable/button.xml中:
<?xml version="1.0" encoding="utf-8"?>
<selectorxmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:state_pressed="true"
android:drawable="@drawable/button_pressed"/><!– pressed –>
<itemandroid:state_focused="true"
android:drawable="@drawable/button_focused"/><!– focused –>
<itemandroid:state_hovered="true"
android:drawable="@drawable/button_focused"/><!– hovered –>
<itemandroid:drawable="@drawable/button_normal"/><!– default –>
</selector>
下面的這個佈局XML在一個Button控件上使用這個狀態列表:
<Button
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:background="@drawable/button"/>
摘自 FireOfStar的專欄