【问题标题】:Clear canvas area with special bitmap's form用特殊的位图形式清除画布区域
【发布时间】:2018-03-23 22:19:48
【问题描述】:

我开发了一个绘图应用程序,我需要实现橡皮擦工具来清除图片的特殊区域。橡皮擦必须不均匀地擦除一些圆形区域。这意味着 - 只有圆心应该被完全擦除,圆的边缘应该被部分擦除,带有 alpha。

为了实现这种行为,我创建了代表橡皮擦图形的图像

然后,为了擦除某些区域,我将橡皮擦的图形画在一些图片上方,如下所示:

private val picture: Bitmap
  private val bgPaint = Paint()
  private var eraser: Bitmap

  private val eraserPaint: Paint = Paint().apply {
    val mode: PorterDuff.Mode = PorterDuff.Mode.SRC_OUT
    xfermode = PorterDuffXfermode(mode)
    color = Color.TRANSPARENT
    alpha = 0
  }

  init {
    val options = BitmapFactory.Options()
    options.inMutable = true
    picture = BitmapFactory.decodeResource(resources, R.drawable.petushara, options)
    eraser = BitmapFactory.decodeResource(resources, R.drawable.eraser, options)
    setLayerType(View.LAYER_TYPE_SOFTWARE, bgPaint)
  }

  override fun draw(canvas: Canvas) {
    super.draw(canvas)
    canvas.drawBitmap(picture, 0f, 0f, bgPaint)
    canvas.drawBitmap(eraser, 100f, 300f, eraserPaint)
  }

这是我的整个视图类,不包括构造函数。我希望图片的区域会被橡皮擦擦除,但它会像这样被正方形擦除:

【问题讨论】:

    标签: android canvas drawing draw


    【解决方案1】:

    好的,我刚刚找到了解决方案。编写如下代码:

      private val picture: Bitmap
      private val bgPaint = Paint()
      private var eraser: Bitmap
    
      private val eraserPaint: Paint = Paint().apply {
        val mode: PorterDuff.Mode = PorterDuff.Mode.XOR
        xfermode = PorterDuffXfermode(mode)
      }
    
      init {
        val options = BitmapFactory.Options()
        options.inMutable = true
        picture = BitmapFactory.decodeResource(resources, R.drawable.petushara, options)
        eraser = BitmapFactory.decodeResource(resources, R.drawable.eraser, options)
        setLayerType(View.LAYER_TYPE_SOFTWARE, bgPaint)
      }
    
      override fun draw(canvas: Canvas) {
        super.draw(canvas)
        canvas.drawBitmap(picture, 0f, 0f, bgPaint)
        canvas.drawBitmap(eraser, 100f, 300f, eraserPaint)
      }
    

    然后结果图片看起来像我的预期:

    【讨论】:

    • 实际上,这不是最好的解决方案。如果您尝试擦除已经被擦除的区域,该区域将被擦除图像颜色着色。在我们的例子中是黑色
    猜你喜欢
    • 1970-01-01
    • 2012-01-16
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多