【发布时间】:2021-07-29 13:45:32
【问题描述】:
我想在画布上填充矩形以外的区域。我用
canvas.drawRect(pTopLeft.x, pTopLeft.y, pBotRight.x, pBotRight.y, paint);
绘制矩形,但不知道如何填充矩形/剪辑之外。
谢谢 杰夫
【问题讨论】:
我想在画布上填充矩形以外的区域。我用
canvas.drawRect(pTopLeft.x, pTopLeft.y, pBotRight.x, pBotRight.y, paint);
绘制矩形,但不知道如何填充矩形/剪辑之外。
谢谢 杰夫
【问题讨论】:
感谢 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);
【讨论】:
您不会在剪辑之外进行填充;这就是剪辑要防止的那种事情!如果要填充矩形外和绘图层边界内的空间,请构建四个辅助矩形:
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),它会打出你想要的洞。
ICS 及以上...
canvas.clipRect(rHole, Region.Op.DIFFERENCE);
XOR、Difference 和 ReverseDifference 剪辑模式是 如果启用了硬件加速,则被 ICS 忽略。
只需在您的视图中禁用 2D 硬件加速:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
【讨论】:
你不能在Canvas之外画画;该区域属于父View。您是否有能力继承父 View 并在该类中进行绘图?
如果您想在Canvas 剪辑之外绘图,则必须invalidate() 您感兴趣的区域。
【讨论】: