更改除路径之外的画布颜色

问题描述

我有一个扩展 ImageView自定义视图。设置图像后,我首先突出显示图像上的某些内容。当我按下按钮时,我想让图像变黑,除了路径的那部分。有什么方法可以实现吗?

我最初尝试的是用第二个画布创建第二个位图,但现在显示它,同时在主画布上绘图时也在黑色画布上用透明颜料绘制,最后一步将它们合并在一起。我无法在黑色画布上实现透明绘图。

@SuppressLint("AppCompatCustomView")
class BlackImageView @JvmOverloads constructor(
    context: Context,attrs: AttributeSet? = null,defStyleAttr: Int = 0
) : ImageView(context,attrs,defStyleAttr) {

    var path: Path = Path()
    var transparentPath: Path = Path()

    var paint: Paint = Paint().apply {
        isAntiAlias = true
        isDither = true
        strokeWidth = 25f
        color = ResourcesCompat.getColor(resources,R.color.highlight,null)
        style = Paint.Style.stroke
        strokeJoin = Paint.Join.ROUND
        strokeCap = Paint.Cap.ROUND
    }

    var transparentPaint: Paint = Paint().apply {
        isAntiAlias = true
        isDither = true
        strokeWidth = 25f
        color = Color.TRANSPARENT
        xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
        style = Paint.Style.stroke
        strokeJoin = Paint.Join.ROUND
        strokeCap = Paint.Cap.ROUND
    }

    private lateinit var blackBitmap: Bitmap
    private lateinit var extraCanvas: Canvas

    override fun onSizeChanged(w: Int,h: Int,oldw: Int,oldh: Int) {
        super.onSizeChanged(w,h,oldw,oldh)

        blackBitmap = Bitmap.createBitmap(w,Bitmap.Config.ARGB_8888)
        extraCanvas = Canvas(blackBitmap)
        extraCanvas.drawColor(Color.BLACK)
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        event?.let {
            when (it.action) {
                MotionEvent.ACTION_DOWN -> {
                    path.moveto(event.x,event.y)
                    transparentPath.moveto(event.x,event.y)

                }
                MotionEvent.ACTION_MOVE -> {
                    path.lineto(event.x,event.y)
                    transparentPath.lineto(event.x,event.y)
                    invalidate()
                }
                MotionEvent.ACTION_UP -> {

                }
                else -> {
                    invalidate()
                    return true
                }
            }
        }

        invalidate()
        return true
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
//        canvas?.drawBitmap(blackBitmap,0f,null)
//        canvas?.drawPath(transparentPath,transparentPaint)
        canvas?.drawPath(path,paint)
    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)