Android應用資源—繪制資源類型(Drawable)(三)

狀態列表

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的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *