在矩形外填充画布

8

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

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

想要绘制矩形,但是不知道如何填充矩形外/裁剪。

谢谢 Geoff

4个回答

19

感谢ted和trojanfoe - 我想出的最简洁的解决方案是

    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);

1
你能分享一下绘制矩形中心并填充边界外部所需考虑的要点吗? - ImMathan

7

您不会在剪辑区域外填充;这就是剪辑的作用,防止这种情况发生!如果您想要填充矩形外部空间且在绘制层边界内部,请构建四个辅助矩形:

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());

然后填写这些内容。

谢谢Ted。我尝试过填充整个画布,然后尝试使剪辑区域透明 - 没有成功。你的方法解决了问题。 - Geoff
5
我知道你已经让它工作了,但我想到另一种可能性:设置一个裁剪区域,排除中间和填充部分。我认为如果你使用 canvas.clipRect(innerRect, Region.Op.DIFFERENCE),它将打出你想要的孔洞。 - Ted Hopp
@TedHopp,实际上我无法获得任何矩形。您能分享一下如何绘制并填充边界外的矩形吗? - ImMathan
@ImMathan - 请发布一个单独的问题,解释你想要做什么,你已经尝试了什么,以及其中有什么问题。如果不知道这些信息,就很难知道如何帮助你。 - Ted Hopp
@TedHopp 这是我的问题。https://dev59.com/-IPba4cB1Zd3GeqPnx7j - ImMathan

2

ICS and above ...

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

如果启用了硬件加速,ICS将忽略XOR、Difference和ReverseDifference剪辑模式。只需在视图中禁用2D硬件加速即可:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
参考Android: Howto use clipRect in API15

0

你不能在Canvas的外面绘制;那个区域属于父级View。你能否对父级View进行子类化,然后在该类中进行绘图?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接