【问题标题】:How to erase path area from canvas (Android)如何从画布上擦除路径区域(Android)
【发布时间】:2012-12-29 07:05:12
【问题描述】:

我需要在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);
}

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

【问题讨论】:

    标签: android canvas path transparency erase


    【解决方案1】:

    要使用透明颜色进行绘制,您必须使用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);

    【讨论】:

    • 用透明颜色绘制,但是绘制的路径是黑色的,有什么解决方法吗??
    【解决方案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 或更高版本。

    【讨论】:

    • 对我不起作用。我仍然有没有任何角落的白色矩形
    • 尝试禁用硬件加速
    • 我尝试在 AndroidManifest.xml 中手动禁用它,但没有帮助
    【解决方案3】:

    使用这条线

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

    而不是这个

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

    【讨论】:

    • 我试过了,但没有任何效果。我没有事件黑色三角形。整个区域都是白色的。
    猜你喜欢
    • 2015-12-27
    • 2017-04-15
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2013-09-09
    • 1970-01-01
    • 2013-12-20
    相关资源
    最近更新 更多