47
public class POCII extends Activity { 

    myView mv = new myView(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(mv); 
    }
}


class myView extends View { 

    public myView(Context context) { 
       super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

        Paint paint = new Paint(); 

        canvas.drawRect(0,0,100,100, paint); 
        canvas.clipRect(0,0,50,50);
    } 
}

我的问题是,上面的代码不应该画一个矩形然后裁剪左上角吗?矩形没有被裁剪。

请解释一下 clipRect 的作用。它实际上是在剪辑什么?给定坐标,它是否以矩形的形式剪辑?如果是这样,为什么上面的代码不起作用?

4

4 回答 4

84

Canvas.clipRect(left, top, right, bottom)减少未来绘图操作可以写入的屏幕区域。它将 clipBounds 设置为当前剪切矩形和指定矩形的空间交集。clipRect 方法有很多变体,它们接受不同的区域形式并允许对剪切矩形进行不同的操作。如果要显式设置剪辑区域,请尝试:

canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE);

第 5 个参数表示替换剪切矩形,而不是创建与以前版本的交集。

尝试将 clipRect 语句移到 drawRect 语句之前。或者,尝试添加:

paint.setColor(Color.YELLOW);
drawRect(0,0,75,75);

在您现有的 clipRect 语句之后。它应该在您之前的区域上绘制一个 50x50 的黄色正方形。

另一个注意事项:(在对显然大部分未记录的视图/视图组/绘图代码感到长期沮丧之后)我发现canvas.translate(x,y)也调整了clipRect。clipRect 和绘图矩阵的交互非常混乱。指出:

canvas.getMatrix()

canvas.getClipBounds()

在修改画布之前和之后以及绘制事物之前。

于 2011-01-10T21:25:29.070 回答
5

要裁剪左上部分,请执行以下操作:

canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE);
// secondly...
canvas.drawRect(0,0,100,100, paint); 
于 2012-09-06T18:55:02.383 回答
4

ICS及以上...

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

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

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

参考Android:如何在API15中使用clipRect

于 2014-01-24T07:29:53.503 回答
2

不使用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 的一半来剪裁矩形):

在此处输入图像描述

相反,如果我们使用 intersect 则如下所示: 在此处输入图像描述

我很想看看是否有人可以让它做圆角。

于 2020-01-02T15:15:35.220 回答