开发中经常需要使用Shape和Selector,如果每个都用xml设置的话,会占用apk大小,同时命名多了也会混乱,使用代码来设置会方便很多。
需要用到2个类:GradientDrawable(shape)和StateListDrawable(Selector)
GradientDrawable相关api:
setColor(rgb); //填充颜色
setGradientType(GradientDrawable.RECTANGLE); //shape矩形
setCornerRadius(radius); //四周圆角半径
setStroke(1,strokenColor); //边框厚度与颜色
gd.setCornerRadii(floats);//设置圆角,左上,右上,右下,左下。八个参数new floats[8 ]
下面提供一个工具类以及使用代码
【工具类DrawableUtils】:shape
public class DrawableUtils {
public static GradientDrawable getDrawable(int rgb,float radius){
GradientDrawable gradientDrawable = new GradientDrawable();
gradientDrawable.setColor(rgb);//设置颜色
gradientDrawable.setGradientType(GradientDrawable.RECTANGLE);//设置显示的样式
gradientDrawable.setCornerRadius(radius);//设置圆角的半径
gradientDrawable.setStroke(DensityUtil.dip2px(1),rgb);//描边
return gradientDrawable;
}
但是如果想设置Gradient的渐变色该咋办呢?
方法是改变GradientDrawable的创建方法:
int colors[] = { 0xff255779 , 0xff3e7492, 0xffa6c0cd };//分别为开始颜色,中间夜色,结束颜色
GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors);
StateListDrawable工具类:seletor---drawable
public static StateListDrawable getSelector(Drawable normalDrawable,Drawable pressDrawable) {
StateListDrawable stateListDrawable = new StateListDrawable();
//给当前的颜色选择器添加选中图片指向状态,未选中图片指向状态
stateListDrawable.addState(new int[]{android.R.attr.state_enabled, android.R.attr.state_pressed}, pressDrawable);
//设置默认状态
stateListDrawable.addState(new int[]{}, normalDrawable);
return stateListDrawable;
}
}
seletor---color
ColorStateList(int[][] states, int[] colors)
参数一:设置状态是一个二维数组 参数二:对应的颜色值
例如:
mBtnTextChange = (Button) findViewById(R.id.btn_text_change);
int[][] states = {{-android.R.attr.state_pressed}, {android.R.attr.state_pressed}}; //状态
ColorStateList colorStateList = new ColorStateList(states, new int[]{Color.BLUE, Color.RED});
mBtnTextChange.setTextColor(colorStateList);
前面带符号的表示android:state_pressed="false"
代码中设置:
//设置Selector
GradientDrawable normalDrawable = DrawableUtils.getDrawable(rgb, radius);
GradientDrawable pressDrawable = DrawableUtils.getDrawable(Color.WHITE, radius);
StateListDrawable selector = DrawableUtils.getSelector(normalDrawable, pressDrawable);
textView.setBackground(selector);
实例:
public void initData(String content) {
//随机打乱datas顺序
Collections.shuffle(Arrays.asList(datas));
random=new Random();
//动态创建TextView
for(int i = 0; i < datas.length; i++) {
TextView textView=new TextView(getActivity());
textView.setText(datas[i]);
//【设置textView的属性】=============================================
//字体大小
textView.setTextSize(DensityUtil.dip2px(10));
//padding
int padding = DensityUtil.dip2px(3);
textView.setPadding(padding,padding,padding,padding);
//margin
ViewGroup.MarginLayoutParams params=new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin=DensityUtil.dip2px(8);
params.topMargin=DensityUtil.dip2px(8);
params.rightMargin=DensityUtil.dip2px(8);
params.bottomMargin=DensityUtil.dip2px(8);
textView.setLayoutParams(params);
//背景颜色
int red=random.nextInt(211);
int green=random.nextInt(211);
int blue=random.nextInt(211);
int rgb= Color.rgb(red, green, blue);
//设置背景方式1:
//textView.setBackgroundColor(rgb);
//设置背景方式2:
float radius=DensityUtil.dip2px(5);
//textView.setBackground(DrawableUtils.getDrawable(rgb,radius));
//【设置textView的点击事件或者说是selector】===========================
//设置Selector
GradientDrawable normalDrawable = DrawableUtils.getDrawable(rgb, radius);
GradientDrawable pressDrawable = DrawableUtils.getDrawable(Color.WHITE, radius);
StateListDrawable selector = DrawableUtils.getSelector(normalDrawable, pressDrawable);
textView.setBackground(selector);
/if(Build.VERSION.SDK_INT < 16){//根据版本
narrowView.setBackgroundDrawable(gd);
}else{
narrowView.setBackground(gd);
}//设置点击响应// textView.setClickable(true);textView.setOnClickListener(new View.OnClickListener()
{@Override
public void onClick(View v) {Toast.makeText(getActivity(), ((TextView)v).getText().toString(), Toast.LENGTH_SHORT).show();}});
//【将textView添加到FramLayout中】=====================================flowLayout.addView(textView);}}
代码中动态改变shape的color:
GradientDrawable drawable =(GradientDrawable)view.getBackground();
drawable.setColor(getResources().getColor(color));