如何正确使用clipRect?

时间:2011-05-23 09:25:31

标签: android view canvas

我正在撰写自定义View,但我无法确定如何在clipRect上使用Canvas。我需要这个,因为我在另一个对象上调用draw(Canvas),我想给它自己(剪裁)Canvas。我目前的解决方案是:

StaticLayout sl = new StaticLayout(text, tp, (int) (rect.right - rect.left), Alignment.ALIGN_NORMAL, 1f, 0f, true);

Bitmap layoutBitmap = Bitmap.createBitmap((int) (rect.right - rect.left), (int) (rect.bottom - rect.top), Config.ARGB_8888);
Canvas layoutCanvas = new Canvas(layoutBitmap);
sl.draw(layoutCanvas);

canvas.drawBitmap(layoutBitmap, null, rect, null);

然而,这感觉很脏,每次创建一个新的位图和一个新的画布(我使用这种方法在一个方框中绘制文本,请参阅my previous question)。

我想做的是这样的事情:

StaticLayout sl = new StaticLayout(text, tp, (int) (rect.right - rect.left), Alignment.ALIGN_NORMAL, 1f, 0f, true);

canvas.save();
canvas.clipRect(rect, Region.Op.REPLACE);
sl.draw(canvas);
canvas.restore();

除非它不起作用,否则“感觉”要好得多。我使用clipRect错了吗?我不明白它的实际用途或使用方法吗?请指教。

P.S。我对clipRect的理解是,在clipRect调用之后,0, 0实际上应该转换为rect.left, rect.top

1 个答案:

答案 0 :(得分:0)

经过一些实验后,似乎clipRect仅将绘图限制为给定rect,因此rect以外的任何绘制调用都将剪裁rect。因此,我对clipRect的理解是错误的。

这意味着,为了使用StaticLayout,我必须首先将其绘制为Bitmap rect的大小,然后绘制Bitmap Canvas在我需要的坐标处找到Canvas.drawText

但是,我已经使用TextPaint.breakTextBitmap代替(因此我不必每次都创建{{1}}。)