Drawable实现代码化

最近一直忙项目、加班、出差、没时间更新博客了。今天抽个空,写一点。博客一定要坚持更下去!
做过Android开发的都知道,在一个项目中,几乎都无法避免要写超多的drawable!
我们有没有什么方式可以减少创建drawable相关的xml呢?
答案是:有的。我们通常写圆角、渐变都是在 gradient 标签下加的属性,所以我们今天的主角就是GradientDrawable。
以下是相关的一些API、最后面有推荐的相关开源项目。


GradientDrawable相关API介绍

填充颜色

1
2
3
4
fun setFillColor(fillColor: Any): Builder {
gradientDrawable?.setColor(DisplayUtil.colorConvert(App.Context, fillColor))
return this
}

复制代码描边颜色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 描边颜色
* @param strokeColor 描边颜色
* @param strokeWidth 描边粗细
*/
fun setStrokeColor(strokeColor: Any, strokeWidth: Int): Builder {
gradientDrawable?.setStroke(
DisplayUtil.dp2px(strokeWidth),
DisplayUtil.colorConvert(App.Context, strokeColor),
0f,
0f
)
return this
}

统一圆角

1
2
3
4
5
6
7
8
/**
* 圆角
@param radius 圆角大小
*/
fun setRadius(radius: Int): Builder {
gradientDrawable?.cornerRadius = DisplayUtil.dp2px(radius).toFloat()
return this
}

分别设置圆角

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 单独设置圆角
*/
fun setAroundRadius(
topLeftRadius: Int,
topRightRadius: Int,
bottomRightRidus: Int,
bottomLeftRidus: Int
): Builder {
gradientDrawable?.cornerRadii = floatArrayOf(
DisplayUtil.dp2px(topLeftRadius).toFloat(),
DisplayUtil.dp2px(topLeftRadius).toFloat(),
DisplayUtil.dp2px(topRightRadius).toFloat(),
DisplayUtil.dp2px(topRightRadius).toFloat(),
DisplayUtil.dp2px(bottomRightRidus).toFloat(),
DisplayUtil.dp2px(bottomRightRidus).toFloat(),
DisplayUtil.dp2px(bottomLeftRidus).toFloat(),
DisplayUtil.dp2px(bottomLeftRidus).toFloat()
)
return this
}

虚线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 虚线
* @param strokeWidth 线宽度
* @param dashColor 虚线颜色
* @param dashWidth 虚线长度
* @param dashGap 虚线间隔
* @param shapeType 虚线类型
* GradientDrawable#LINE 线
* GradientDrawable#OVAL 椭圆
* GradientDrawable#RECTANGLE 矩形
*/
fun setDash(
strokeWidth: Int,
dashColor: Any,
dashWidth: Int,
dashGap: Int,
shapeType: Int = GradientDrawable.LINE
): Builder {
gradientDrawable?.apply {
setStroke(
DisplayUtil.dp2px(strokeWidth),
DisplayUtil.colorConvert(App.Context, dashColor),
DisplayUtil.dp2px(dashWidth).toFloat(),
DisplayUtil.dp2px(dashGap).toFloat()
)
shape = shapeType
}
return this
}

渐变色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//渐变色
fun setShadow(
orientation: GradientDrawable.Orientation,
startColor: Any,
endColor: Any
): Builder {
//如果需要渐变色需要在第一个调用
gradientDrawable = GradientDrawable(
orientation, intArrayOf(
DisplayUtil.colorConvert(App.Context, startColor),
DisplayUtil.colorConvert(App.Context, endColor)
)
)
return this
}

辅助工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 颜色转换
*
* @param color
* @return
*/
fun colorConvert(context: Context?, color: Any): Int {
if (color is String) {
return Color.parseColor(color.toString())
}
return if (color is Int) {
ContextCompat.getColor(context!!, color)
} else R.color.colorAccent
}

其他XML相关开源库