一般我们要实现一个控件按压变背景色,我们会写selector的xml文件,比如:
今天我告诉大家一个动态的方法改变文字的颜色和控件的背景色,以后不需要那么麻烦的写xml文件了:
/**
* 控件背景色选择器
*
* @param context 当前上下文
* @param idNormal 默认图片
* @param idPressed 按压时图片
* @return
*/
public static StateListDrawable setSelector(Context context, int idNormal, int idPressed) {
StateListDrawable bg = new StateListDrawable();
Drawable normal = idNormal == -1 ? null : context.getResources().getDrawable(idNormal);
Drawable pressed = idPressed == -1 ? null : context.getResources().getDrawable(idPressed);
bg.addState(new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}, pressed);
bg.addState(new int[]{android.R.attr.state_enabled}, normal);
bg.addState(new int[]{}, normal);
return bg;
}
/**
* 控件字体颜色选择器
*
* @param mContext 当前上下文
* @param normal 默认显示颜色
* @param pressed 按压后显示的颜色
* @return
*/
public static ColorStateList createColorStateList(Context mContext, int normal, int pressed) {
int pressColor = mContext.getResources().getColor(pressed);
int normalColor = mContext.getResources().getColor(normal);
int[] colors = new int[]{pressColor, pressColor, normalColor, pressColor, pressColor, normalColor};
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;
}
在Activity中调用也很方便,如这样:
好了,就到这里,亲测没问题,不会上传动态图,有什么问题可以留言!