我正在撰写自定义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
。
答案 0 :(得分:0)
经过一些实验后,似乎clipRect
仅将绘图限制为给定rect
,因此rect
以外的任何绘制调用都将剪裁到rect
。因此,我对clipRect
的理解是错误的。
这意味着,为了使用StaticLayout
,我必须首先将其绘制为Bitmap
rect
的大小,然后绘制Bitmap
Canvas
在我需要的坐标处找到Canvas.drawText
。
但是,我已经使用TextPaint.breakText
和Bitmap
代替(因此我不必每次都创建{{1}}。)