如何正确使用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.drawTextTextPaint.breakText 代替(所以我不必每次都创建Bitmap)。

【讨论】:

以上是关于如何正确使用clipRect?的主要内容,如果未能解决你的问题,请参考以下文章

j2me:“g.clipRect()”对速度有啥影响?

Flutter:调整/放大使用 ClipRect 剪辑的图像

clipRect 介绍

ClipOval,ClipRRect,ClipRect,ClipPath(每日Flutter 小部件)

Canvas: canvas.clipRect()方法的作用

android clipRect Op.xxx各个参数理解