项目中经常遇到一个按钮需要不同的状态效果,如点击效果、普通效果、禁用效果等,如果给每个控件都在drawable下新建个xml样式文件,那一个工程下来,就会有太多的xml文件, 所以通过代码实现样式效果,一劳永逸。
代码:
多张图片样式:
<span style="font-size:14px;">public StateListDrawable createStateListDrawable() {
StateListDrawable state = new StateListDrawable();
state.addState(new int[]{-android.R.attr.state_enabled}, mAttrs.getDisableDrawable());
state.addState(new int[]{android.R.attr.state_checked}, mAttrs.getCheckedDrawable());
state.addState(new int[]{android.R.attr.state_pressed}, mAttrs.getPressedDrawable());
state.addState(new int[]{}, mAttrs.getNormalDrawable());
return state;
}</span>
画的多个shape样式: drawable下的 selector 对应 GradientDrawable类
<span style="font-size:14px;">/**
* 形状状态
* @author thduan
* 2015-12-29 15:12:19
*/
public class ShapeStateListCreator {
private ShapeAttrs mAttrs;
public ShapeStateListCreator(ShapeAttrs attrs) {
mAttrs = attrs;
}
public StateListDrawable createStateListDrawable() {
DrawableAttrs drawableAttrs = new DrawableAttrs();
drawableAttrs.setNormalDrawable(normalDrawable());
drawableAttrs.setPressedDrawable(pressedDrawable());
drawableAttrs.setCheckedDrawable(checkedDrawable());
drawableAttrs.setDisableDrawable(disableDrawable());
return new DrawableStateListCreator(drawableAttrs).createStateListDrawable();
}
private GradientDrawable disableDrawable() {
if(mAttrs.hasDisableState()) {
return newGradientDrawable(mAttrs.getDisableArgb(),
mAttrs.getStrokeDisableArgb());
}else {
return null;
}
}
private GradientDrawable pressedDrawable() {
if(mAttrs.hasPressedState()) {
return newGradientDrawable(mAttrs.getPressedArgb(),
mAttrs.getStrokePressedArgb());
}else {
return null;
}
}
private GradientDrawable checkedDrawable() {
if(mAttrs.hasCheckedState()) {
return newGradientDrawable(mAttrs.getCheckedArgb(),
mAttrs.getStrokeCheckedArgb());
}else {
return null;
}
}
private GradientDrawable normalDrawable() {
if(mAttrs.hasNormalState()) {
return newGradientDrawable(mAttrs.getNormalArgb(),
mAttrs.getStrokeNormalArgb());
}else {
return null;
}
}
private GradientDrawable newGradientDrawable(int color, int strokeColor) {
GradientDrawable drawable = new GradientDrawable();
drawable.setShape(mAttrs.getShapeType());
drawable.setColor(color);
drawable.setStroke(mAttrs.getStrokeWidth(), strokeColor);
if(mAttrs.getCornerRadii() != null && mAttrs.getCornerRadii().length == 8) {
drawable.setCornerRadii(mAttrs.getCornerRadii());
}
return drawable;
}
}
</span>
activity中使用:
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
DrawableTools.setImageDrawableWithStateList(imageView,
new ShapeAttrs() //画形状
.setNormalArgb("#D682A3") //普通时的颜色
.setPressedArgb("#A8D499") //按下时的颜色
.setStrokeWidth(4) //如果不希望有边框,不设置该属性即可,或设置为0
.shapeOval() //形状为圆形, 还可以设置为矩形
.setStrokeNormalArgb("#0000ff") //普通时边框的颜色
.setStrokePressedArgb("#F9DF92") //按下时边框的颜色
);
工程代码上传到csdn了,下载地址:http://download.csdn.net/detail/duantihi/9398346