答案 0 :(得分:76)
Canvas.clipRect(left, top, right, bottom)
缩小了未来绘制操作可以写入的屏幕区域。它将clipBounds设置为当前剪切矩形和指定矩形的空间交集。 clipRect方法有很多变体可以接受不同的区域形式,并允许对剪切矩形进行不同的操作。如果要显式设置剪辑区域,请尝试:
canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE);
第5个参数表示替换剪切矩形,而不是创建与先前版本的交集。
尝试在drawRect语句之前移动clipRect语句。或者,尝试添加:
paint.setColor(Color.YELLOW);
drawRect(0,0,75,75);
在你现有的clipRect语句之后。它应该绘制一个50x50的黄色正方形。
另一个注意事项:(在显然,很大程度上未记录的View / ViewGroup /绘图代码长期受挫之后),我发现canvas.translate(x,y)也调整了clipRect。 clipRect和绘图矩阵的交互非常混乱。打印出来很有帮助:
canvas.getMatrix()
和
canvas.getClipBounds()
在修改画布之前和之后以及绘制之前。
答案 1 :(得分:4)
要裁剪左上部分,请执行:
canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE);
// secondly...
canvas.drawRect(0,0,100,100, paint);
答案 2 :(得分:4)
ICS及以上......
XOR,差异和反向差异剪辑模式 如果启用了硬件加速,ICS会忽略它。
只需在视图中禁用2D硬件加速:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
答案 3 :(得分:0)
您的绘图无需使用cliprect即可如下:
现在,如果我们使用cliprect,则将矩形覆盖在现有的覆盖上。它是看不见的。可以说我们称之为:
override fun onDraw(canvas: Canvas) {
val paint = Paint();
paint.color = Color.RED
canvas.clipRect(0f,0f,500f,500f, Region.Op.DIFFERENCE);
// secondly...
canvas.drawRect(0f,0f,1000f,1000f, paint);
}
因为我们使用了DIFFERENCE选项,并且我们知道剪裁矩形现在位于我们的画布红色矩形上方,所以我们可以告诉我一些特别的事情。上面说我们应该保持剪切矩形和原始矩形之间的差异。所以它看起来像这样(因为我使用了1000的一半作为矩形的裁剪):
我很想看看是否有人可以使其圆角。