学而实习之 不亦乐乎

Android:StateListDrawable 资源

2022-07-17 10:46:17

StateListDrawable 用于组织多个 Drawable 对象。当使用 StateListDrawable 合为目标组件的背景、前景图片时,StateListDrawable 对象所显示的 Drawable 对象会随目标组件状态的改变面自动切换。

一、使用简介

其XML文件根元素为 <selector>,它可以包含多个 <item> 元素。可以指定以下属性:

  • android:color    指定颜色
  • android:drawable    指定Drawable对象
  • android:state_xxx    指定一个特定状态

语法格式如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <!--指定特定状态下的颜色-->
    <item android:color="hex_color" android:state_pressed=["true"|"false"] />
</selector>

item所支持的状态如下:

android:state_active    是否被激活
android:state_checkable    组件是否能被check。如:RadioButton是可以被check的。
android:state_checked    用户选中了View,一般用于CheckBox这种非黑即白的选项
android:state_enabled    当前View处于可用的状态
android:state_first是    否处于开始状态
android:state_focused    当前View获取了焦点
android:state_last        是否处于结束状态
android:state_middle    是否处于中间状态
android:state_pressed    按下的状态,(按下但是还没松开)
android:state_selected    用户选择了当前View
android:state_hovered    光标是否悬停,通常与focused state相同,它是4.0的新特性
android:state_window_focused    应用程序是否在前台,当有通知栏被拉下来或者一个对话框弹出的时候应用程序就不在前台了

二、实例:

1.与ripple涟漪的配合使用

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <ripple android:color="@color/white" android:radius="1000dp">
            <item android:drawable="@mipmap/ico_ripple" />
        </ripple>
    </item>
    <item android:state_focused="true" android:drawable="@mipmap/ico_ripple"/>
    <item android:drawable="@mipmap/ico_ripple" android:state_selected="true" />
    <item android:drawable="@mipmap/ico_ripple"/>
</selector>

2.点击变换颜色

<?xml version="1.0" encoding="utf-8"?>
<!--别看这里我们使用的是ovrl(椭圆) ,但是我们得到可是 圆形 的点击效果-->
<selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape android:shape="oval">
            <solid
                android:color="#ff0000" />
            <stroke
                android:width="4dp"
                android:color="#294736" />
        </shape>
    </item>
    <item >
        <shape android:shape="oval">
            <solid
                android:color="#848374" />
            <stroke
                android:width="4dp"
                android:color="#745863" />
        </shape>
    </item>
</selector>

3.Edittext的背景框和焦点变化

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_window_focused="false">
        <shape android:shape="rectangle">
            <solid
                android:color="#FFFFFFFF"/>
            <corners
                android:radius="3dp"/>
            <padding
                android:left="10dp"
                android:right="10dp"/>
            <stroke
                android:width="1dp"
                android:color="#BDC7D8"/>
        </shape>
    </item>

    <item android:state_focused="true" >
        <shape android:shape="rectangle" >
            <solid
                android:color="#FFFFFFFF"/>
            <corners
                android:radius="3dp"/>
            <padding
                android:left="10dp"
                android:right="10dp"/>
            <stroke
                android:width="1dp"
                android:color="#728ea3"/>
        </shape>
    </item>
</selector>

4.Edittext输入框

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape android:shape="rectangle">
            <corners android:radius="10dp" />
            <solid android:color="@color/deep_orange" />
         </shape>
    </item>
    <item >
        <shape android:shape="rectangle">
            <corners android:radius="10dp" />
            <solid android:color="@color/orange" />
         </shape>
    </item>
</selector>

在 UI 中使用

<EditText
	android:id="@+id/username"
	android:layout_width="match_parent"
	android:layout_height="40dp"
	android:layout_gravity="center_horizontal"
	android:background="@null"
	android:drawableBottom="@drawable/selector_edittext_line"
	android:hint="@string/user_name"
	android:paddingLeft="10dip"
	android:singleLine="true"
	android:textColor="#000"
	android:textSize="18sp"/>