我们注意到有些应用里的按钮在点击时的显示状态和普通状态是不一样的,比如:
普通状态下: ![](image/d41d8cd98f00b204e9800998ecf8427e.png)
选中状态下:![](image/d41d8cd98f00b204e9800998ecf8427e.png)
那这种效果是如何实现的呢?在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卡