美文网首页
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