问题描述
我有一个扩展 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 (将#修改为@)