首页 > 代码库 > Android中StateListDrawable和Selector的使用

Android中StateListDrawable和Selector的使用

在用户进行操作的时候总是会提示出不同的状态,比如当我们按下button时,光标移动到button上并没有按下以及当前状态不在该button时总会显示不同的状态,在Android系统中提供给我们一种方便与实现这种功能的方法即:state list drawable。

StateListDrawable是在XML中定义的drawable对象,我们可以通过设置不同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_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"] />

</selector>

<selector>为根节点,其下子节点只有一个为item

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文件如select_button.xml

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true"

android:drawable="@drawable/button_pressed" /> <!-- pressed -->

<item android:state_focused="true"

android:drawable="@drawable/button_focused" /> <!-- focused -->

<item android:drawable="@drawable/button_normal" /> <!-- default -->

</selector>

2.在layout xml文件中引用:如

<ImageView

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:src="http://www.mamicode.com/@drawable/select_button" />

PS完整实例:

<selector

xmlns:android="http://schemas.android.com/apk/res/android">

<!-- 没有焦点时的背景颜色 -->

<item android:state_window_focused="false"

android:drawable="@color/transparent" />

<!-- 非触摸模式下获得焦点并单击时的背景颜色 -->

<item android:state_focused="true" android:state_pressed="true"

android:drawable="@color/bgred" />

<!--触摸模式下单击时的背景颜色 -->

<item android:state_focused="false" android:state_pressed="true"

android:drawable="@color/bgred" />

<!--选中时的背景颜色 -->

<item android:state_selected="true" android:drawable="@color/bgred" />

<!--获得焦点时的背景 颜色-->

<item android:state_focused="true" android:drawable="@color/bgred" />

</selector>

Android中StateListDrawable和Selector的使用