StateListDrawable

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StateListDrawable相关的知识,希望对你有一定的参考价值。

参考技术A 其他Draw文章参考:
android中Drawable整体介绍

状态列表
StateListDrawable 是在 XML 中定义的可绘制对象,它根据对象的状态(State),使用多个不同的图像来表示同一个图形。例如,Button小部件可以是多种不同状态(按下、聚焦或这两种状态都不是)中的其中一种,而且可以利用状态列表可绘制对象为每种状态提供不同的背景图片。

您可以在 XML 文件中描述状态列表。每个图形由单一 <selector> 元素内的 <item> 元素表示。每个 <item> 均使用各种属性来描述应用作可绘制对象的图形的状态。

匹配规则:
在每个状态变更期间,将从上到下遍历状态列表,并使用第一个与当前状态匹配的项目 —此选择并非基于“最佳匹配”,而是选择符合状态最低条件的第一个项目。

在StateListDrawable中,一组item标签表示的是:状态列表。

必备。这必须是根元素。包含一个或多个 <item> 元素。
属性:
xmlns:android
字符串。必备。定义 XML 命名空间,其必须是 " http://schemas.android.com/apk/res/android "。

android:constantSize
布尔值。如果可绘制对象报告的内部大小在状态变更时保持不变,则值为“true”(大小是所有状态的最大值);如果大小根据当前状态而变化,则值为“false”。默认值为 false。
StateListDrawable的固有大小是否不随着其状态的改变而改变,因为状态的改变会导致StateListDrawable切换到具体的Drawable,而不同的Drawable具有不同的固有大小。True表示StateListDrawable的固有大小保持不变,这时他的固有大小是内部所有Drawable的固有大小的最大值,false则会改变。
需要注意:如果是把这个drawable当做背景的话,那么这个drawable固有大小不管多大,都会拉伸到View的大小
如果给ImageView当做src使用,那么,false之后就会drawable的固有大小就变了,并且其并不会拉伸值ImageView的大小,可以得到一大一下的效果。

android:dither
布尔值。值为“true”时,将在位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕)启用位图的抖动;值为“false”时则停用抖动。默认值为 true。

android:variablePadding
布尔值。如果可绘制对象的内边距应根据选择的当前状态而变化,则值为“true”;如果内边距应保持不变(基于所有状态的最大内边距),则值为“false”。启用此功能要求您在状态变更时处理执行布局,这通常不受支持。默认值为 false。不建议开启此项

定义要在某些状态期间使用的可绘制对象,如其属性所述。必须是 <selector> 元素的子项。
属性:
android:drawable
可绘制对象资源。必备。引用可绘制对象资源。

android:state_pressed
布尔值。如果在按下对象(例如触摸/点按某按钮)时应使用此项目,则值为“true”;如果在默认的未按下状态时应使用此项目,则值为“false”。比如ImageView,只有你设置android:clickable = true ,就可以满足

android:state_focused
布尔值。如果在对象具有输入焦点(例如当用户选择文本输入时)时应使用此项目,则值为“true”;如果在默认的非焦点状态时应使用此项目,则值为“false”。

android:state_hovered
布尔值。如果当光标悬停在对象上时应使用此项目,则值为“true”;如果在默认的非悬停状态时应使用此项目,则值为“false”。通常,这个可绘制对象可能与用于“聚焦”状态的可绘制对象相同。
此项为 API 级别 14 新引入的配置。

android:state_selected
布尔值。如果在使用定向控件浏览(例如使用方向键浏览列表)的情况下对象为当前用户选择时应使用此项目,则值为“true”;如果在未选择对象时应使用此项目,则值为“false”。
当焦点 (android:state_focused) 不充分(例如,列表视图有焦点但使用方向键选择其中的项目)时,使用所选状态。

android:state_checkable
布尔值。如果当对象可选中时应使用此项目,则值为“true”;如果当对象不可选中时应使用此项目,则值为“false”。(仅当对象可在可选中与不可选中小部件之间转换时才有用。)指示对象可以显示复选标记的状态标识符。比如checkbox

android:state_checked
布尔值。如果在对象已选中时应使用此项目,则值为“true”;如果在对象未选中时应使用此项目,则值为“false”。一般也是checkbox这类再选中和非选中之间进行切换的View.

android:state_enabled
布尔值。如果在对象启用(能够接收触摸/点击事件)时应使用此项目,则值为“true”;如果在对象停用时应使用此项目,则值为“false”。

android:state_activated
布尔值。如果在对象激活作为持续选择(例如,在持续导航视图中“突出显示”之前选中的列表项)时应使用此项目,则值为“true”;如果在对象未激活时应使用此项目,则值为“false”。
此项为 API 级别 11 新引入的配置。

android:state_window_focused
布尔值。如果当应用窗口有焦点(应用在前台)时应使用此项目,则值为“true”;如果当应用窗口没有焦点(例如,通知栏下拉或对话框出现)时应使用此项目,则值为“false”。

注:请记住,Android 将将使用状态列表中第一个与对象当前状态匹配的项目。因此,如果列表中的第一个项目不含上述任何状态属性,则每次都会应用它,这就是默认值应始终放在最后的原因(如以下示例所示)。因为有上面属性组成的状态列表,可能存在交集,所以就通过从上往下匹配,匹配到那个合适就采用哪一个。

Android开发-Android常用组件-Button按钮

4.3  Button(按钮)

  • Button控件继承TextView ,拥有TextView的属性。
  • StateListDrawable简介

StateListDrawable是Drawable资源的一种,可以根据不同的状态,设置不同的图片效果,关键节点<selector>,我们只需要将Button的background 属性设置为该drawable资源,即可轻松实现按下按钮时不同的按钮颜色或背景!

属性名

说明

drawable

引用的Drawable位图,我们可以把他放到最前面,就表示组件的正常状态~

state_focused

是否获得焦点

state_window_focused

是否获得窗口焦点

state_enabled

控件是否可用

state_checkable

控件可否被勾选

state_checked

控件是否被勾选

state_selected

控件是否被选择,针对有滚轮的情况

state_pressed

控件是否被按下

state_active

控件是否处于活动状态

state_single

控件包含多个子控件时,确定是否只显示一个子控件

state_first

控件包含多个子控件时,确定第一个子控件是否处于显示状态

state_middle

控件包含多个子控件时,确定中间一个子控件是否处于显示状态

state_last

控件包含多个子控件时,确定最后一个子控件是否处于显示状态

   示例: 在drawable文件夹下新建一个xml文件 btn_bg1.xml。

 

 btn_bg1.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/dark_gray" android:state_pressed="true"/>  //控件被按下时变成深灰
    <item android:drawable="@color/lawn_green" android:state_enabled="false"/>    //控件不可用时变成绿色
    <item android:drawable="@color/purple_200"/>    //控件平常时显示浅紫色
</selector>

 

 layout文件夹中创建botton.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="match_parent"
    android:orientation="vertical"
    android:background="#eeeeee"
    android:paddingTop="50dp">

    <Button
        android:id="@+id/btnOne"
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:background="@drawable/btn_bg1"
        android:text="按钮"
        android:textColor="@color/white"
        android:textSize="20sp"
        android:textStyle="bold"/>
    <Button
        android:id="@+id/btnTwo"
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:text="按钮不可用"
        android:textColor="@color/black"
        android:textSize="20sp"
        android:textStyle="bold"/>


</LinearLayout>

MainActivity.java:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;


public class MainActivity extends AppCompatActivity 

    private Button btnOne,btnTwo;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.button);
        btnOne = (Button) findViewById(R.id.btnOne);
        btnTwo = (Button) findViewById(R.id.btnTwo);
        btnTwo.setOnClickListener(new View.OnClickListener()   //按钮绑定事件
            @Override
            public void onClick(View v)
                if (btnTwo.getText().toString().equals("按钮不可用"))
                    btnOne.setEnabled(false);
                    btnTwo.setText("按钮可用");
                else 
                    btnOne.setEnabled(true);
                    btnTwo.setText("按钮不可用");
                
            
        );

    

 

以上是关于StateListDrawable的主要内容,如果未能解决你的问题,请参考以下文章