平时我们对GradientDrawable的使用都是静态使用,也就是在xml中使用shape标签定义。
其实呢,我们也可以在代码中动态设置背景。
//新建一个Drawable对象
GradientDrawable drawable=new GradientDrawable();
//设置背景色
drawable.setColor(Color.rgb(255,0,0));
//设置边框的厚度以及边框的颜色
drawable.setStroke(1,Color.rgb(0,0,0));
//设置圆角的半径 当然也是可以一个个设置圆角的半径
drawable.setCornerRadius(20);
//设置背景的形状,默认就是矩形,跟xml文件中类型android:shape的值保持一致,具体有:GradientDrawable.LINE GradientDrawable.OVAL GradientDrawable.RECTANGLE GradientDrawable.RING
drawable.setShape(GradientDrawable.RECTANGLE);
//判断当前版本号,版本号大于等于16,使用setBackground;版本号小于16,使用setBackgroundDrawable。
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
{
tvDrawable.setBackground(drawable);
}else{
tvDrawable.setBackgroundDrawable(drawable);
}
学会了这个,自然地就会想到Selector选择器是否也可以在代码中动态设置呢?当然也是可以的
//背景1 背景红色 边框宽度为1,黑色
GradientDrawable drawable=new GradientDrawable();
drawable.setColor(Color.rgb(255,0,0));
drawable.setStroke(1,Color.rgb(0,0,0));
drawable.setCornerRadius(20);
drawable.setShape(GradientDrawable.RECTANGLE);
//背景2 背景蓝色 边框宽度为1,黑色
GradientDrawable drawable2=new GradientDrawable();
drawable2.setColor(Color.rgb(0,0,0));
drawable2.setStroke(1,Color.rgb(0,0,0));
drawable2.setCornerRadius(20);
drawable2.setShape(GradientDrawable.RECTANGLE);
//动态生成Selector
int pressed = android.R.attr.state_pressed; //取负值就表示pressed为false的意思
StateListDrawable drawable3= new StateListDrawable();
drawable3.addState(new int[]{pressed},drawable);// 状态 , 设置按下的图片
drawable3.addState(new int[]{-pressed}, drawable2);//默认状态,默认状态下的图片
个人觉得在某个shape或者selector选择器用得不多的情况下,可以考虑使用代码动态生成,这样可以减少drawable文件夹下面少一些xml文件。
使用了一阵子之后,发现还忘了用代码实现背景渐变的效果。
GradientDrawable drawable;
//API大于等于16
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
{
drawable=new GradientDrawable();
//俩设置方法其实就是对应着带参构造参数的那俩参数
drawable.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT);
drawable.setColors(colors);
}else{
drawable = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, colors);
}
drawable.setCornerRadii(radius);
drawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);
API小于16的时候,需要使用GradientDrawable的带参构造函数;API大于16的时候,直接调用相关方法就行了。
在项目中使用的时候,可以将上述功能写成一个工具类,然后直接调用。
import android.graphics.drawable.GradientDrawable;
import android.os.Build;
import android.view.View;
/**
* Created by Administrator on 2018/8/3 0003.
*/
public class DrawableGetUtil {
/**
*
* @param radius 四个角的半径
* @param colors 渐变的颜色
* @return
*/
public static GradientDrawable getNeedDrawable(float []radius,int []colors) {
//TODO:判断版本是否大于16 项目中默认的都是Linear散射 都是从左到右 都是只有开始颜色和结束颜色
GradientDrawable drawable;
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
{
drawable=new GradientDrawable();
drawable.setOrientation(GradientDrawable.Orientation.LEFT_RIGHT);
drawable.setColors(colors);
}else{
drawable = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, colors);
}
drawable.setCornerRadii(radius);
drawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);
return drawable;
}
/**
*
* @param radius 四个角的半径
* @param bgColor 背景颜色
* @param strokeWidth 边框宽度
* @param strokeColor 边框颜色
* @return
*/
public static GradientDrawable getNeedDrawable(float []radius, int bgColor,int strokeWidth, int strokeColor) {
GradientDrawable drawable = new GradientDrawable();
drawable.setCornerRadii(radius);
drawable.setStroke(strokeWidth, strokeColor);
drawable.setColor(bgColor);
return drawable;
}
/**
*
* @param radis 四个角的半径
* @param bgColor 背景颜色
* @return
*/
public static GradientDrawable getNeedDrawable(float []radis,int bgColor)
{
GradientDrawable drawable=new GradientDrawable();
drawable.setCornerRadii(radis);
drawable.setColor(bgColor);
return drawable;
}
/**
*
* @param drawable 生成的背景
* @param view 需要添加背景的View
*/
public static void setBackground(GradientDrawable drawable,View view)
{
//判断当前版本号,版本号大于等于16,使用setBackground;版本号小于16,使用setBackgroundDrawable。
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
{
view.setBackground(drawable);
}else{
view.setBackgroundDrawable(drawable);
}
}
}
使用实例如下:
float []r1=new float[8];
float []r2=new float[8];
for(int i=0;i<8;i++)
{
r1[i]=10f;
r2[i]=50f;
}
float []r3={50f,50f,0,0,0,0,50f,50f};
//转发点击
DrawableGetUtil.setBackground(DrawableGetUtil.getNeedDrawable(r1,Color.rgb(255,255,255),1,Color.rgb(255,46,37)),tvForwardingClick);
//状态
DrawableGetUtil.setBackground(DrawableGetUtil.getNeedDrawable(r2,new int[]{Color.rgb(253,187,155),Color.rgb(249,47,0)}),tvState);
//分享收益
DrawableGetUtil.setBackground(DrawableGetUtil.getNeedDrawable(r2,new int[]{Color.rgb(253,187,155),Color.rgb(249,47,0)}),tvMoneyValue);
//倒计时
DrawableGetUtil.setBackground(DrawableGetUtil.getNeedDrawable(r3,Color.rgb(155,155,155)),tvTime);