美文网首页
Android ColorStateList,StateList

Android ColorStateList,StateList

作者: 逃离_102 | 来源:发表于2022-07-14 18:49 被阅读0次

说明

在Android开发过程中经常会用到,一个控件在按下,或者获取焦点等不同状态时展示不同颜色,或者背景的需求,当然这个可以用xml选择器来解决,这样处理不够灵活,ColorStateList,StateListDrawable而却可以让我们很灵活的处理这种事情,下面就简单说说用法。

Xml选择器示例

颜色选择器放color文件夹下;Drawable选择器放drawable文件加下。有些许不同,不能混用。

//Drawable选择器
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/bg_test"/>
    <item android:state_pressed="false" android:drawable="@drawable/bg_test_1"/>
</selector>

//color选择器
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#ffffff"/>
    <item android:state_pressed="false" android:color="#00ff00"/>
</selector>

ColorStateList使用

ColorStateList有3种方式:1,直接布局文件中使用;2,解析xml选择器,再设置;3,直接new,再设置。对应相应的状态:Color state list resource

//直接布局文件中使用
<Button
  android:id="@+id/btn"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="按键"
  android:textColor="@color/selecter_color"/>

//解析xml选择器,再设置
ColorStateList colorStateList = getResources().getColorStateList(R.color.selecter_color,this.getTheme());
Button button = findViewById(R.id.btn);
button.setTextColor(colorStateList);

//直接new,再设置
//这里有两个点要注意,第一个参数是二维数组,数组的第一级个数和后面的颜色是一一对应,如果颜色多了会用前几个对应该的颜色,如果颜色少了可能会文字不见了
//当要设置属性 android.R.attr.state_pressed = false 时,只要在第一个数组里面的属性名前加 '-'
ColorStateList colorStateList = new ColorStateList(new int[][]{{-android.R.attr.state_pressed}, {android.R.attr.state_pressed}},
                new int[]{Color.RED, Color.BLUE});
        Button button = findViewById(R.id.btn);
        button.setTextColor(colorStateList);

StateListDrawable使用

StateListDrawable有2种方式:1,直接布局文件中使用;2,直接new,再设置

//直接布局文件中使用
<FrameLayout
  android:id="@+id/fl"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/selecter_drawable"/>

//直接new,再设置
private void setButtonBackground(){
   //初始化一个空对象
  StateListDrawable stalistDrawable = new StateListDrawable();
  //获取对应的属性值 Android框架自带的属性 attr
  int pressed = android.R.attr.state_pressed;
  int focused = android.R.attr.state_focused;

  stalistDrawable.addState(new int []{-pressed}, getResources().getDrawable(R.drawable.ic_launcher));
  stalistDrawable.addState(new int []{pressed}, getResources().getDrawable(R.drawable.ic_launcher));
  stalistDrawable.addState(new int []{-focused }, getResources().getDrawable(R.drawable.ic_launcher));
  //没有任何状态时显示的图片,我们给它设置我空集合
 stalistDrawable.addState(new int []{}, getResources().getDrawable(R.drawable.ic_launcher));
        
 Button button = findViewById(R.id.btn);
 button.setBackground(stalistDrawable);
}

StateListDrawable跟ColorStateList区别

1,StateListDrawable,ColorStateList不能混用,textColor不能用StateListDrawable,background不能用ColorStateList,;
2,ColorStateList 继承至 Object,而 StateListDrawable 间接继承至 Drawable,ColorStateList 根据 View 状态显示不同的 Color,StateListDrawable 根据 View 状态显示不同的 Drawable。

就说到这了,有什么不对的地方,欢迎指正,有什么没说全的,欢迎讨论留言

相关文章

网友评论

      本文标题:Android ColorStateList,StateList

      本文链接:https://www.haomeiwen.com/subject/cfnzbrtx.html