“ 自定义drawable和自定义view都能根据自己的描述来绘制内容,区别是drawable只能绘制而不能相应触摸事件,多用于view的背景。 ”
先放效果图
class CustomDrawable : Drawable() {
private var mOpacity = 0
private var mRect = Rect()
private var mCorner = 0f
private var mPaint = Paint().apply {
isAntiAlias = true
style = Paint.Style.FILL
}
private var mStrokePaint = Paint().apply {
isAntiAlias = true
style = Paint.Style.STROKE
}

//这里需要给stroke一点偏移量,否则会出现圆角被裁切的情况
//因为我们需要让
//stroke的绘制中心 - stroke/2 == rect.left
//stroke的绘制中心 + stroke/2 == rect.right
//stroke的绘制中心 - stroke/2 == rect.top
//stroke的绘制中心 + stroke/2 == rect.bottom
private val mStrokeRect:Rect
get() {
val out = Rect(mRect)
val offset = ( mStrokePaint.strokeWidth/2).toInt()
out.left += offset
out.right -= offset
out.top += offset
out.bottom -= offset
return out
}
/**
* @param color @colorInt 参数为颜色值,非id,如 Color.parse("#eaeaea")
*/
fun setColor(color:Int){
mPaint.color = color
}
/**
* @param color 如 ”#eaeaea“
*/
fun setColor(color:String){
mPaint.color = Color.parseColor(color)
}
fun setStrokeWidth(width:Float){
mStrokePaint.strokeWidth = width
}
fun setStrokeColor(color: Int){
mStrokePaint.color = color
}
fun setStrokeColor(color:String){
mStrokePaint.color = Color.parseColor(color)
}
fun setCorner(corner:Float){
mCorner = corner
}
override fun draw(canvas: Canvas) {
canvas.drawRoundRect(mRect.toRectF(),mCorner,mCorner,mPaint)
canvas.drawRoundRect(mStrokeRect.toRectF(),mCorner,mCorner,mStrokePaint)
}
override fun onBoundsChange(bounds: Rect?) {
super.onBoundsChange(bounds)
if (bounds != null) {
mRect = bounds
}
}
override fun setAlpha(alpha: Int) {
}
override fun setColorFilter(colorFilter: ColorFilter?) {
}
override fun getOpacity(): Int = PixelFormat.UNKNOWN
}
如何使用
val drawable = CustomDrawable().apply {
setColor("#eaeaea")
setCorner(20f)
setStrokeColor("#ff0000")
setStrokeWidth(5f)
}
binding.view.background = drawable
最后再看一眼效果图