代码之家  ›  专栏  ›  技术社区  ›  ZeroOne

使用透明绘制半径角点矩形

  •  1
  • ZeroOne  · 技术社区  · 7 年前

    我正在使用此库进行QrCode扫描 me.dm7.barcodescanner .

    问题是我不能用透明的黑色给背景上色,然后中心应该是透明的。我将中心颜色改为透明将消失(当然是因为透明背景)。

    它应该像第二幅图像,背景是透明的黑色,中心是透明的,圆角半径为矩形。。

    代码:

    mFinderMaskPaint = new Paint();
    mFinderMaskPaint.setColor(getResources().getColor(me.dm7.barcodescanner.core.R.color.viewfinder_mask));
    

    ..

    public void drawViewFinderMask(Canvas canvas) {
         int width = canvas.getWidth();
         int height = canvas.getHeight();
         Rect framingRect = getFramingRect();
    
         RectF rectF = new RectF(framingRect.left, framingRect.top, framingRect.right, framingRect.bottom);
         canvas.drawRoundRect(rectF, 100, 100, mFinderMaskPaint);
    
    //     canvas.drawRect(0, 0, width, framingRect.top, mFinderMaskPaint);
    //     canvas.drawRect(0, framingRect.top, framingRect.left, framingRect.bottom + 1, mFinderMaskPaint);
    //     canvas.drawRect(framingRect.right + 1, framingRect.top, width, framingRect.bottom + 1, mFinderMaskPaint);
    //     canvas.drawRect(0, framingRect.bottom + 1, width, height, mFinderMaskPaint);
    }
    

    苏。我目前的目标是:

    enter image description here

    在设计上应该是这样的: enter image description here

    1 回复  |  直到 7 年前
        1
  •  3
  •   Henry    7 年前

    这里的技巧不是填充圆形矩形的内部,而是只填充外部。您可以通过更改圆形矩形的填充类型来实现这一点。现在您需要使用 Path 为了这个。

    RectF rectF = new RectF(framingRect.left, framingRect.top, framingRect.right, framingRect.bottom);
    final Path path = new Path()
    path.addRoundRect(rectF, 100f, 100f, Path.Direction.CW)
    path.setFillType(Path.FillType.INVERSE_WINDING)
    canvas.drawPath(path, mFinderMaskPaint);