动态改变FloatingActionButton的背景颜色
设置fab的背景颜色时,使用
fab.setBackgroundColor(Color.WHITE);
是无效的,很苦恼,到方法里看看
public void setBackgroundColor(int color) {
Log.i("FloatingActionButton", "Setting a custom background is not supported.");
}
居然只是给打印了条日志…
再找到下面这个方法:
fab.setBackgroundTintList();
参数需要传入ColorStateList,那ColorStateList 又是啥呢?
ColorStateList
ColorStateList对象可以在XML中定义
像color一样使用,它能根据它应用到的View对象的状态实时改变颜色。例如,Button可以存在多种状态(pressed、focused或other),如果使用ColorStateList,你就能为它的每个状态提供不同的颜色。
你可以在XML文件中描述状态列表。每种颜色定义在一个元素里,放在单个元素里。每个使用不同的特性来描述在何种状态下使用。
当每次状态改变时,StateList都会从上到下遍历一次,第一个匹配当前状态的item将被使用——选择的过程不是基于“最佳匹配”,只是符合state的最低标准的第一个item。
注意:如果你想提供一个静态的color资源,使用简单的Color值。
- 首先添加一个ColorStateList资源XML文件,XML文件保存在res/color/yourname.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="#ffff0000"/>
<item android:state_focused="true" android:color="#ff0000ff"/>
<item android:color="#ff000000"/>
</selector>
- 使用
Resources resource=(Resources)getBaseContext().getResources();
ColorStateList csl=(ColorStateList)resource.getColorStateList(R.color.yourname);
或者可以在代码中创建
private ColorStateList createColorStateList(int normal, int pressed, int focused, int unable) {
int[] colors = new int[] { pressed, focused, normal, focused, unable, normal };
int[][] states = new int[6][];
states[0] = new int[] { android.R.attr.state_pressed, android.R.attr.state_enabled };
states[1] = new int[] { android.R.attr.state_enabled, android.R.attr.state_focused };
states[2] = new int[] { android.R.attr.state_enabled };
states[3] = new int[] { android.R.attr.state_focused };
states[4] = new int[] { android.R.attr.state_window_focused };
states[5] = new int[] {};
ColorStateList colorList = new ColorStateList(states, colors);
return colorList;
}
使用 可以根据自己的需求定义颜色:
fab.setBackgroundTintList(createColorStateList(0xffffff00, 0xffffff00, 0xff0000ff, 0xffff0000));
这样 不仅可以动态改变fab的颜色 更是可以对应到每一个按钮的状态!
ColorStateList同样可以应用到textview button中来改变颜色.