Android-代码动态创建Shape并运用到控件背景(Grad
2019-08-14 本文已影响2人
MonkeyLei
最近再做通用弹窗的封装FanChael/CommonPopupWindow,在涉及到注册、登录弹窗的时候,为了统一色调(光标、下划线、按钮、文本框),用户调用时会传入颜色“#xxxxxxx”,这个时候就需要修改按钮、文本框的背景shape的动态修改(因为涉及到圆角处理,所以其背景采用了shape的方式)。
1. 创建shape,做了下封装 - 跟xml的方式一样,都是设置相关属性,不慌不慌!
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
/*
*@Description: Shape创建工具
*@Author: hl
*@Time: 2019/2/19 16:42
*/
public class ShapeUtil {
/**
* 创建一个Shape - GradientDrawable
*
* @param _strokeWidth - 沿边线厚度;无需传入-1
* @param _roundRadius - 圆角半径;无需传入-1
* @param _shape - shape绘制类型(rectangle、oval等);无需传入-1,将采用默认的GradientDrawable.RECTANGLE
* @param _strokeColor - 沿边线颜色;无需传入null/""
* @param _fillColor - 内部填充颜色
* @return
*/
public static GradientDrawable createShape(int _strokeWidth,
int _roundRadius, int _shape,
String _strokeColor, String _fillColor) {
int strokeWidth = _strokeWidth; // px not dp
int roundRadius = _roundRadius; // px not dp
int strokeColor = -1;
if (null != _strokeColor && !_strokeColor.equals("")) {
strokeColor = Color.parseColor(_strokeColor);
}
int fillColor = Color.parseColor(_fillColor);
GradientDrawable gd = new GradientDrawable();
gd.setColor(fillColor);
if (-1 == _shape) {
gd.setShape(GradientDrawable.RECTANGLE);
} else {
gd.setShape(_shape);
}
if (-1 != roundRadius) {
gd.setCornerRadius(roundRadius);
}
if (-1 != strokeWidth && -1 != strokeColor) {
gd.setStroke(strokeWidth, strokeColor);
}
return gd;
}
}
2. 进行Button、TextView的相关shape背景设置
///< 创建一个
GradientDrawable gradientDrawable = ShapeUtil.createShape(-1,
6,
-1, null, allColor);
///< minsdk最小为15,因此做了个兼容判断;
TextView getVerifyTv = findViewById(R.id.xxxx);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
getVerifyTv.setBackground(gradientDrawable);
}else{
getVerifyTv.setBackgroundDrawable(gradientDrawable);
}
- 注意,多个控件需要创建多个GradientDrawable,不能共用一个GradientDrawable,否则显示要出问题!