说明
在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。
网友评论