开发中平时用到了圆角背景,但是每个圆角背景都不一样,这样还要创建多个xml布局,为了简单快捷,可以使用代码创建圆角背景.
这里以创建矩形圆角背景为例.GradientDrawable.RECTANGLE.
先看效果图
- 常用方法(创建xml)
- 代码 动态创建
- 代码修改已有布局
创建xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--填充色-->
<solid android:color="#FF82AB" />
<!--线条-->
<stroke
android:width="2dp"
android:color="#FF0000" />
<!--角度-->
<corners android:radius="8dp" />
</shape>
代码 动态创建
1.创建每个角度都一样的背景
/**
* 创建背景颜色
*
* @param color 填充色
* @param strokeColor 线条颜色
* @param strokeWidth 线条宽度 单位px
* @param radius 角度 px
*/
public static GradientDrawable createRectangleDrawable(@ColorInt int color, @ColorInt int strokeColor, int strokeWidth, float radius) {
try {
GradientDrawable radiusBg = new GradientDrawable();
//设置Shape类型
radiusBg.setShape(GradientDrawable.RECTANGLE);
//设置填充颜色
radiusBg.setColor(color);
//设置线条粗心和颜色,px
radiusBg.setStroke(strokeWidth, strokeColor);
//设置圆角角度,如果每个角度都一样,则使用此方法
radiusBg.setCornerRadius(radius);
return radiusBg;
} catch (Exception e) {
return new GradientDrawable();
}
}
2.自定义每个方向的圆角角度
/**
* 创建背景颜色
*
* @param color 填充色
* @param strokeColor 线条颜色
* @param strokeWidth 线条宽度 单位px
* @param radius 角度 px,长度为4,分别表示左上,右上,右下,左下的角度
*/
public static GradientDrawable createRectangleDrawable(@ColorInt int color, @ColorInt int strokeColor, int strokeWidth, float radius[]) {
try {
GradientDrawable radiusBg = new GradientDrawable();
//设置Shape类型
radiusBg.setShape(GradientDrawable.RECTANGLE);
//设置填充颜色
radiusBg.setColor(color);
//设置线条粗心和颜色,px
radiusBg.setStroke(strokeWidth, strokeColor);
//每连续的两个数值表示是一个角度,四组:左上,右上,右下,左下
if (radius != null && radius.length == 4) {
radiusBg.setCornerRadii(new float[]{radius[0], radius[0], radius[1], radius[1], radius[2], radius[2], radius[3], radius[3]});
}
return radiusBg;
} catch (Exception e) {
return new GradientDrawable();
}
}
代码修改已有布局
前提是在xml中,或者已设置的背景,必须是GradientDrawable.否则就会异常
GradientDrawable bg4 = (GradientDrawable) view.getBackground();
//修改填充色
bg4.setColor(Color.parseColor("#EEEE00"));
//这里还可以修改线条, 角度..等
这里对于不同的不需要设置的属性,可以在方法中判断一下,不设置,或者给其默认值.
例如:如果不需要设置边框颜色和宽度,那么就不需要使用setStroke()方法设置.
这里就不一一举例了.