自定义Drawable来避免创建过多的drawable资源文件

83 阅读1分钟

“ 自定义drawable和自定义view都能根据自己的描述来绘制内容,区别是drawable只能绘制而不能相应触摸事件,多用于view的背景。 ”

先放效果图

device-2022-12-14-143845.png

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
    }
    
![device-2022-12-14-143845.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/92a63fd931e64c68b366e5c36a78518b~tplv-k3u1fbpfcp-watermark.image?)
    //这里需要给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

最后再看一眼效果图

device-2022-12-14-143845.png