牛骨文教育服务平台(让学习变的简单)

我们注意到有些应用里的按钮在点击时的显示状态和普通状态是不一样的,比如:

普通状态下:
选中状态下:

那这种效果是如何实现的呢?在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中子控件点击时的效果。这里就不再赘述了。