时间:2010-07-26 01:54:57

标签: android android-canvas android-view

4 个答案:

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

参考Android: Howto use clipRect in API15

答案 3 :(得分:0)

您的绘图无需使用cliprect即可如下:

enter image description here

现在,如果我们使用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的一半作为矩形的裁剪):

enter image description here

相反(如果我们使用相交)将如下所示: enter image description here

我很想看看是否有人可以使其圆角。