如何从画布擦除路径区域(Android)

时间:2013-01-15 08:02:09

标签: android canvas path transparency erase

我需要在ImageView上裁剪角落。不要围绕它们,而是从每个角落擦除三角形。

似乎唯一的方法是覆盖onDraw方法并使用Path从画布中删除这些区域。问题是我没有纯色背景,所以我需要删除这些区域,但不要用一些颜色填充它们。

我使用以下代码:

@Override
protected void onDraw(Canvas canvas) {
    Path path = new Path();
    path.moveTo(0, 0);
    path.lineTo(20, 0);
    path.lineTo(0, 20);
    path.close();

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    canvas.drawPath(path, paint);
    super.onDraw(canvas);
}

但角落是黑色但不透明。你可以帮帮我吗?或者你可能知道我的任务更好的解决方案。这是它的样子。

enter image description here

3 个答案:

答案 0 :(得分:7)

为了使用透明色绘制,您必须使用Paint setXfermode,这只有在您为画布设置位图时才有效。如果您按照以下步骤操作,则应获得所需的结果。

  1. 创建画布并设置其位图。

    mCanvas = new Canvas();
    mBitmap= Bitmap.createBitmap(scrw, scrh, Config.ARGB_8888);
    mCanvas.setBitmap(mBitmap);
    
  2. 当您想要删除某些内容时,您只需要使用setXfermode。

    if (isErasing)
       mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    else
       mPaint.setXfermode(null);
    
  3. 现在您应该可以使用以下方法绘制透明色:

    mCanvas.drawPath(yourpath, mPaint);

答案 1 :(得分:2)

您可以剪辑画布对象:

@Override
protected void onDraw(Canvas canvas) {
    final Path path = new Path();
    final int count = canvas.save();

    path.moveTo(0, 20);
    path.lineTo(20, 0);
    path.lineTo(getWidth(), 0);
    path.lineTo(getWidth(), getHeight());
    path.lineTo(0, getHeight());
    path.close();

    canvas.clipPath(path);
    super.onDraw(canvas);
    canvas.restoreToCount(count);
}

请注意Canvas.clipPath在启用硬件加速的Android 3.0或更高版本上无效。

答案 2 :(得分:-1)

使用此行

 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

而不是

 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));