1. 程式人生 > >Android Selector的介紹與用法

Android Selector的介紹與用法

Selector對於大家來說都是比較熟悉的,常見的會用在Button或者ListView,少見的也有RadioButton等等,主要應用於不同狀態下的樣式設定。

一、官方介紹

其實它是可繪製物件資源中的狀態列表(StateListDrawable )

 是在 XML 中定義的可繪製物件,它根據物件的狀態,使用多個不同的影象來表示同一個圖形。例如, 小部件可以是多種不同狀態(按下、聚焦或這兩種狀態都不是)中的其中一種,而且可以利用狀態列表可繪製物件為每種狀態提供不同的背景圖片。

您可以在 XML 檔案中描述狀態列表。每個圖形由單一 <selector> 元素內的 <item>

 元素表示。每個 <item> 均使用各種屬性來描述應用作可繪製物件的圖形的狀態。

在每個狀態變更期間,將從上到下遍歷狀態列表,並使用第一個與當前狀態匹配的專案 —此選擇並非基於“最佳匹配”,而是選擇符合狀態最低條件的第一個專案。

檔案位置:

res/drawable/filename.xml
檔名用作資源 ID。

編譯的資源資料型別:

資源引用:

在 Java 中:R.drawable.filename
在 XML 中:@[package:]drawable/filename

語法:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns: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>

元素:

<selector>必備。這必須是根元素。包含一個或多個 <item> 元素。

<item>定義要在某些狀態期間使用的可繪製物件,如其屬性所述。必須是 <selector> 元素的子項。

item屬性:

android:drawable可繪製物件資源必備。引用可繪製物件資源。

android:state_**這裡有九種情況。官網寫的比較是專業,所以後面還是自己給出了對他的理解,比較容易看懂的。

二、對android:state_**的清晰理解:

android:state_pressed 是否按下,如一個按鈕觸控或者點選。

android:state_focused 是否取得焦點,比如使用者選擇了一個文字框。

android:state_hovered 游標是否懸停,通常與focused state相同,它是4.0的新特性

android:state_selected 被選中,它與focus state並不完全一樣,如一個list view 被選中的時候,它裡面的各個子元件可能通過方向鍵,被選中了。

android:state_checkable 元件是否能被check。如:RadioButton是可以被check的。

android:state_checked 被checked了,如:一個RadioButton可以被check了。

android:state_enabled 能夠接受觸控或者點選事件

android:state_activated 被啟用(這個麻煩舉個例子,不是特明白)

android:state_window_focused 應用程式是否在前臺,當有通知欄被拉下來或者一個對話方塊彈出的時候應用程式就不在前臺了

注意:如果有多個item,那麼程式將自動從上到下進行匹配,最先匹配的將得到應用。(不是通過最佳匹配)

如果一個item沒有任何的狀態說明,那麼它將可以被任何一個狀態匹配。

三、常見用法:

舉例Button的正常樣式跟點選樣式,這裡舉例就兩種樣式,在專案中也可能設定Button的其他state下的樣式,下面只是為了方便介紹。

1、固定的樣式設定:不可變的,只需要一個xml  (item_bg.xml)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="6dp" />
            <padding android:bottom="10dp" android:left="20dp" android:right="20dp" android:top="10dp" />
            <solid android:color="@color/white" />
            <stroke android:width="1dp" android:color="@color/green_deep_color" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <corners android:radius="6dp" />
            <solid android:color="@color/white" />
            <padding android:bottom="10dp" android:left="20dp" android:right="20dp" android:top="10dp" />
            <stroke android:width="1dp" android:color="@color/black_deep" />
        </shape>
    </item>
</selector>

這裡須有pressed的效果跟下面item沒有設定的預設兩種樣式

2、可選擇的樣式設定:可選的,需要三個xml   (item_bg.xml,item_bg_normal.xml,item_bg_pressed.xml)

item_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/popup_item_bg1_pressed" android:state_pressed="true" />
    <item android:drawable="@drawable/popup_item_bg1_normal" />
</selector>

item_bg_normal.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="6dp" />
    <solid android:color="@color/white" />
    <padding
        android:bottom="10dp"
        android:left="20dp"
        android:right="20dp"
        android:top="10dp" />
    <stroke
        android:width="1dp"
        android:color="@color/black_deep" />
</shape>

item_bg_pressed.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="6dp" />
    <padding
        android:bottom="10dp"
        android:left="20dp"
        android:right="20dp"
        android:top="10dp" />
    <solid android:color="@color/white" />
    <stroke
        android:width="1dp"
        android:color="@color/green_deep_color" />
</shape>

有人說用這要三個xml不覺得蛋疼嗎,我也覺得有點,不過還是看具體分析來的。如果你要求要在程式碼中可以進行對樣式的選中呢?這樣就要三個了,如果沒有說後續要進行可選的,我還是建議用第一種,方便即少xml,資源不會太多。

3、另外一種是通過程式碼實現,這裡就不詳細介紹了,網上有很多文章介紹的蠻詳細