【问题标题】:Fill canvas outside rectangle在矩形外填充画布
【发布时间】:2021-07-29 13:45:32
【问题描述】:

我想在画布上填充矩形以外的区域。我用

 canvas.drawRect(pTopLeft.x, pTopLeft.y, pBotRight.x, pBotRight.y, paint);

绘制矩形,但不知道如何填充矩形/剪辑之外。

谢谢 杰夫

【问题讨论】:

    标签: android canvas


    【解决方案1】:

    感谢 ted 和 *foe - 我想出的最巧妙的解决方案是

        Point pTopLeft = new Point();
        Point pBotRight = new Point();
    
        //TODO:set x,y for points
    
        Rect rHole = new Rect(pTopLeft.x, pTopLeft.y, pBotRight.x, pBotRight.y);
        //assume current clip is full canvas
        //put a hole in the current clip
        canvas.clipRect(rHole,  Region.Op.DIFFERENCE);
        //fill with semi-transparent red
        canvas.drawARGB(50, 255, 0, 0);
        //restore full canvas clip for any subsequent operations
        canvas.clipRect(new Rect(0, 0, canvas.getWidth(), canvas.getHeight())
                        , Region.Op.REPLACE);
    

    【讨论】:

    • 你能告诉我画一个矩形中心并在边界外填充的要点吗?
    【解决方案2】:

    您不会在剪辑之外进行填充;这就是剪辑要防止的那种事情!如果要填充矩形外和绘图层边界内的空间,请构建四个辅助矩形:

    Rect above = new Rect(0, 0, canvas.getWidth(), pTopLeft.y);
    Rect left = new Rect(0, pTopLeft.y, pTopLeft.x, pBotRight.y);
    Rect right = new Rect(pBotRight.x, pTopLeft.y, canvas.getWidth(), pBotRight.y);
    Rect bottom = new Rect(0, pBotRight.y, canvas.getWidth(), canvas.getHeight());
    

    然后填写这些。

    【讨论】:

    • 谢谢特德。我玩弄了填充整个画布然后试图使剪辑区域透明 - 不好。你的方法成功了。
    • 我知道您现在可以使用它,但我想到了另一种可能性:设置一个不包括中间和填充的剪辑区域。我认为如果你使用canvas.clipRect(innerRect, Region.Op.DIFFERENCE),它会打出你想要的洞。
    • @TedHopp 实际上我无法得到任何矩形。你能分享我如何在边界外绘制矩形和填充矩形吗?
    • @ImMathan - 请发布一个单独的问题,解释您正在尝试做什么、您尝试了什么以及它不起作用的原因。不知道这一点,很难知道如何提供帮助。
    • @TedHopp 这是我的问题。 *.com/questions/25679259/…
    【解决方案3】:

    ICS 及以上...

    canvas.clipRect(rHole,  Region.Op.DIFFERENCE);
    

    XOR、Difference 和 ReverseDifference 剪辑模式是 如果启用了硬件加速,则被 ICS 忽略。

    只需在您的视图中禁用 2D 硬件加速:

    myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

    参考Android: Howto use clipRect in API15

    【讨论】:

      【解决方案4】:

      你不能在Canvas之外画画;该区域属于父View。您是否有能力继承父 View 并在该类中进行绘图?

      如果您想在Canvas 剪辑之外绘图,则必须invalidate() 您感兴趣的区域。

      【讨论】: