用 ColorStateList 动态改变控件背景色


年关将至,项目也不那么急了,也有了大把的时间,所以在做一个 Gank.io 的客户端,为这个客户端最多的网站再添一个属于我的客户端,主要是为了熟悉目前最流行的框架,Rxjava、Retrofit2、和 MVP 模式,再就是认认真真的做一个自己满意:+1:的 Gank.io 客户端

本文记录动态改变新控件背景等颜色的方法。

在做首页时突然想到可以使用支持库中的 Palette (调色板)从加载的 Banner 妹子图中取颜色设置到项目中所有的控件,以达到自动动态改变主题色的效果。

于是找到了这个强大好用的开源库 GlidePalette,这个库可以在使用 Glide 加载图片时获取到图片调色板的颜色值,于是解决了获取网络图片调色板的问题,接下来就是动态改变各个控件背景色了。

PS: PicassoPalette 这是 GlidePalette 的 Picasso 版本。

ColorStateList

ColorStateList 类用于构建不同状态下控件对应的颜色,对,和 xml 文件中常写的 selector 的作用是一样的,区别在于 selector 是静态的,不能动态改变控件的颜色,需要在 java 代码中动态改变控件各个状态下的颜色,就要用到 ColorStateList

使用 ColorStateList 也很简单,用构造方法创建一个 ColorStateList 对象,再使用控件对应的方法设置即可。

栗子:

// 颜色数组
int[] colors = new int[]{color, color1, color2, color3, color4, color5};

// 颜色数组对应的状态
int[][] states = new int[6][];
states[0] = new int[]{android.R.attr.state_checked, 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[]{};

switchCompat.setThumbTintList(new ColorStateList(states, colors));

可以看到,ColorStateList 构造方法需要传递两个数组 states、colors,对应控件的状态和状态下的颜色,状态数组是一个二维数组,可以把两个及以上的状态放在一个状态数组中,方便设置相同的颜色值。

评论