我們注意到有些應用里的按鈕在點擊時的顯示狀態和普通狀態是不一樣的,比如:
普通狀態下: 
選中狀態下:
那這種效果是如何實現的呢?在Android系統中提供給我們一種方便與實現這種功能的方法即:state list drawable。
**StateListDrawable**是在XML中定義的drawable對象,我們可以通過設置不同item下的圖片來顯示不同狀態,這取決于 drawable對象的狀態。例如,一個Button控件可以有不同的狀態(點擊、聚焦等),通過一系列的drawable對象,可以為每個不同的狀態提供不同的背景圖片。
可以通過一個xml文件來描述這個狀態序列,通過一個`<selector>`元素下的`<item>`元素來代表每個背景,其中每個`<item>`可以使用不同的屬性值來描述某個狀態。
當狀態發生改變時,狀態列表從上到下進行掃描,會使用第一個匹配當前狀態的圖片。這個選擇不是基于最佳匹配,而是簡單選擇遇到的第一個滿足條件的項目。
它的XML文件定義如下:
~~~
<?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>**`
必須的。為根節點,包含一個或多個節點。 - android:constantSize: boolean型,默認為false;
-
android:dither:boolean型,默認為true,當位圖與屏幕的像素配置不一樣時(例如,一個ARGB為8888的位圖與RGB為555的屏幕)會自行遞色(dither)。設置為false時不可遞色;
-
android:variablePadding:boolean型,默認為false,當設置為true時,則drawable的padding值隨當前選擇的狀態而改變。
-
`**<item>**`
-
android:drawable:必須的參數,drawable資源;
-
android:state_pressed:boolean型,設置為true時表示當對象被按下時該item會顯示或者說生效,為false時表示該item為默認狀態非選中狀態;
-
android:state_focused:boolean型,為true時表示該item生效為焦點在對象上時,false為非選中狀態;
-
android:state_selected:boolean型,同上功能,該屬性表示的時被選擇狀態;
-
android:state_checkable:boolean型,僅僅用在可以選擇widget上,為true表示可選擇,為false表示不可選;
-
android:state_checked:boolean型,為true時,表示當選中時該item生效,false為未選中時生效;
-
android:state_enabled:boolean型,當為true時,該item在對象可激活時生效,如該對象可以接受觸摸或者點擊事件時;
-
android:state_window_focused:boolean型,為true時,表示該item在當前窗口焦點為該應用程序窗口時生效也就是說該應用程序窗口為foreground,否則為false;
1. 在/res/drawable 目錄下建立自己需要的.xml文件如button_selector.xml
~~~
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_enabled="true" android:state_window_focused="false" android:drawable="@drawable/button_background"/>
<item android:state_pressed="true" android:state_window_focused="true" android:drawable="@drawable/button_background_selected"/>
<item android:state_focused="true" android:drawable="@drawable/button_background"/>
<item android:drawable="@drawable/button_background"/>
</selector>
~~~
2.在layout xml文件中引用:
~~~
<Button
android:id="@+id/bt_first_dialog_confirm"
android:layout_width="140dip"
android:layout_height="40dip"
android:background="@drawable/button_selector"
android:text="確定"
android:textColor="#ffffffff" />
~~~
同時我們也可以設置GridView中子控件點擊時的效果。這里就不再贅述了。
- 前言
- Appcompat_V7問題
- This Android SDK requires Android Developer Toolkit version 23.0.0 or above
- 創建Android項目不自動生成Activity,layout目錄為空
- 新建android項目gen目錄下未生成R文件
- 手機安全衛士02:splash界面ui
- 知識點:Android控件系列之Toast
- 手機安全衛士03:獲取更新的服務器配置,顯示更新對話框
- 異常處理:android.os.NetworkOnMainThreadException--多線程問題
- 知識點:Android控件系列之對話框AlertDialog.Builder
- 手機安全衛士04_01:界面(Activity)之間的切換,Activity和任務棧
- 知識點:Android控件系列之ProgressDialog與ProgressBar
- 手機安全衛士04_02:從服務器下載并安裝新版本安裝包
- 知識點:Intent
- 知識點:Adapter適配器
- 手機安全衛士05_1:程序主界面
- 手機安全衛士05_2:程序主界面,為每個條目添加事件
- 知識點:動態設置布局LayoutInflater
- 知識點:SharedPreferences
- 手機安全衛士06-手機防盜之自定義對話框
- 手機安全衛士07-手機防盜之進入限制
- 手機安全衛士08-一些布局和顯示的細節:State List
- 手機安全衛士09-手機防盜界面設置向導1
- 手機安全衛士10-設置向導之綁定SIM卡