如何正确使用clipRect?
Posted
技术标签:
【中文标题】如何正确使用clipRect?【英文标题】:How to properly use clipRect? 【发布时间】:2011-05-23 09:25:31 【问题描述】:我正在编写自定义View
,但我真的不知道如何在Canvas
上使用clipRect
。我需要这个,因为我在另一个对象上调用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
错了吗?我不明白它的实际用途或如何使用它吗?请指教。
附:我对clipRect
的理解是,在clipRect
调用之后,0, 0
实际上应该转换为rect.left, rect.top
。
【问题讨论】:
【参考方案1】:经过一些试验,clipRect
似乎只将绘图限制为给定的rect
,因此rect
之外的任何绘图调用都将剪辑到该rect
.因此,我对clipRect
的理解是错误的。
这意味着,为了使用StaticLayout
,我必须先将它绘制到与我的rect
大小相同的Bitmap
,然后将Bitmap
绘制到我的Canvas
我需要的坐标。
但是,我使用Canvas.drawText
和TextPaint.breakText
代替(所以我不必每次都创建Bitmap
)。
【讨论】:
以上是关于如何正确使用clipRect?的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:调整/放大使用 ClipRect 剪辑的图像
ClipOval,ClipRRect,ClipRect,ClipPath(每日Flutter 小部件)