前言
shape在实际开发中非常常用,一般我们会在xml中使用,但涉及到颜色动态变更时,我们需要在代码中动态创建。
xml中的shape,实际上被创建出来后它是一个Drawable
,点开Drawable的子类一看,我们很容易就发现一些可疑的实现类(不看需要额外依赖的),我在这里推荐几个。
- ColorDrawable
- ShapeDrawable
- GradientDrawable
一、ColorDrawable
此类适用于只有颜色时的Drawable
val tv = TextView(context)
tv.background = ColorDrawable(Color.BLUE)
二、ShapeDrawable
很明显,这个类能够被我们直接当做shape使用,此类可以让我们通过Paint自行修改需要的颜色、边距等参数。
val tv = TextView(context)
tv.background = ShapeDrawable().apply{
this.setPadding(1,2,3,4)
this.paint.setColor(Color.BLUE)
}
三、GradientDrawable
这个类的用处可以说是非常广泛了,看名字就知道它适用于渐变色的shape,没错,它能够处理我们常用的渐变色、边框线条、圆角等。
val tv = TextView(context)
tv.background = GradientDrawable().apply{
this.setPadding(1,2,3,4)
this.cornerRadius = 10f // 指定圆角
this.setStroke(20, Color.BLUE) // 指定边框
this.gradientType = GradientDrawable.LINEAR_GRADIENT // 指定渲染角度
this.colors = intArrayOf(Color.BLUE, Color.TRANSPARENT) // 指定渐变色
}
当然它也能对圆角进行自定义,比如我这里指定了一个左上和右上角10大小、左下和右下不变(直角)的圆角shape。我们对函数cornerRadii()
赋值,需要一个8位的float数组, 原因参考(Path.addRoundRect())。
val tv = TextView(context)
tv.background = GradientDrawable().apply{
// 指定圆角
this.cornerRadii = floatArrayOf(
10f,10f, // 左上
10f,10f, // 右上
0f, 0f,
0f, 0f
)
}
GradientDrawable类是我在开发中使用最多的,个人感觉基本够用。