【边做项目边学Android】手机安全卫士08-一些布局和显示的细节:State List

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

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

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

时间: 2024-10-09 22:44:51

【边做项目边学Android】手机安全卫士08-一些布局和显示的细节:State List的相关文章

【边做项目边学Android】手机安全卫士01:splash界面ui

手机安全卫士项目是跟着黑马的视频做的. splash是飞洒.飞溅的意思,主要是用于完成一个产品logo显示,期间可以: 后台完成数据库初始化的操作 联网访问服务器,获取服务器最新信息(升级提示) 不同的日期显示出来不同logo,判断当前系统时间,素材一般从服务器上下载下来. 判断时间,根据不同时间显示不同的加载页面 布局文件:splash.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayou

【边做项目边学Android】知识点:动态设置布局LayoutInflater

一.作用: LayoutInflater作用是将layout的xml布局文件实例化为View类对象,LayoutInflater 的作用类似于 findViewById(),不同点是LayoutInflater是用来找layout文件夹下的xml布局文件,并且实例化!而 findViewById()是找具体某一个xml下的具体 widget控件(如:Button,TextView等). 二.获得 LayoutInflater 实例的三种方式 1.LayoutInflater inflater =

【边做项目边学Android】知识点:Adapter适配器

1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的 View(ListView,GridView)等地方都需要用到Adapter.如下图直观的表达了Data.Adapter.View三者的关系: Android中所有的Adapter一览: 由图可以看到在Android中与Adapter有关的所有接口.类的完整层级图.在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展.比较常用的有 BaseAdapter,Simple

【边做项目边学Android】手机安全卫士03:获取更新的服务器配置,显示更新对话框

配置应用程序在手机桌面显示的名称和图标-AndroidManifest.xml: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.liuhao.mobilesafe" android:versionCode="

【边做项目边学Android】手机安全卫士04_01:界面(Activity)之间的切换,Activity和任务栈

上一回说到,用户选择是否升级,若用户选择不升级,那么就要进入程序的主界面.下面要做的是从splash界面跳转到main界面. MainActivity创建 1.首先新建MainActivity: package com.liuhao.mobilesafe.ui; import com.liuhao.mobilesafe.R; import android.app.Activity; import android.os.Bundle; public class MainActivity exten

【边做项目边学Android】手机安全卫士09-手机防盗界面设置向导1

本次主要做手机防盗界面的设置向导功能界面的设计. 需求: 当用户进入手机防盗界面时,判断用户是否已经进行过设置向导: 如果用户已经设置过手机防盗,则不再提示用户进入手机向导 若还没有设置,则提示用户进入设置向导界面. 具体实现: 1.当用户输入"手机防盗"密码正确时,进行判断用户是否进行过设置向导 /** * 判断用户是否进行过设置向导 * @return */ private boolean isSetup(){ return sp.getBoolean("isAlread

【边做项目边学Android】手机安全卫士10-设置向导之绑定SIM卡

上回主要做了设置向导界面的界面设计,主要涉及到界面的布局和一些控件的使用.这次要做设置向导界面的功能具体实现. 首先,4个界面分别是(重复度很大,这里就不再贴到正文中了) /mobilesafe/res/layout/setup_wizard1.xml /mobilesafe/res/layout/setup_wizard2.xml /mobilesafe/res/layout/setup_wizard3.xml /mobilesafe/res/layout/setup_wizard4.xml

【边做项目边学Android】手机安全卫士05_1:程序主界面

主界面布局(知识点:GridView) mainscreen.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height=

【边做项目边学Android】手机安全卫士07-手机防盗之进入限制

上次写到在进入手机但·防盗界面时需要有密码限制,首先第一次进入时会弹出对话框提示用户设置密码:再次进入时会要求用户输入密码:这次来具体实现上述功能. 首次登录,设置密码 首先,我们的密码是保存在SharePreference中的"password"字段里的,在登录时后台需要校验该字段是否已经设置了密码,若未设置则弹出对话框让用户设置,否则要用户输入密码进入手机防盗界面: 校验是否设置了密码 @Override protected void onCreate(Bundle savedIn