代码中设置Shape和Selector

开发中经常需要使用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));







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值