我能使用setClipBounds将一个视图剪裁成圆形吗?

4
我有以下代码来限定要绘制的视图区域:
Rect rect = new Rect();
rect.set(0, 0, 100, 100);
View.setClipBounds(rect);

这将仅在指定的矩形(或在此情况下为正方形)上绘制我的视图。然而,我希望视图被剪切成圆形。是否有办法使 Rect 对象的角变得圆滑?


在我看来,最好的选择是覆盖你的视图的onDraw方法,并使用drawPath方法,例如路径为圆角矩形。 - Pedro Oliveira
3个回答

6
在这种情况下,您需要对该视图进行子类化并添加一些额外的逻辑。
将以下代码添加到其构造方法中,或者您希望初始化视图的任何位置。
final Path path = new Path();
path.addRoundRect(new RectF(0,0,getWidth(),getHeight()),10,10,Direction.CW);

使用这些代码,您正在定义一个路径,沿着这条路径绘制视图(在补丁边界内的区域)。
将此方法添加到类中以在视图上应用此掩码。
@Override
protected void dispatchDraw(Canvas canvas){
    canvas.clipPath(path);
    super.dispatchDraw(canvas);
}

致谢:https://dev59.com/bmsz5IYBdhLWcg3w8Mir#7559233

这段文字是感谢一位在stackoverflow网站上提供帮助的人。

2

尝试使用

RectF r = new RectF(10,100,200,400);
canvas.drawRoundRect(r, 0, 0, mPaint);

关于圆角或正方形的问题。

另一种方法是使用剪裁掩码。这个想法的概念是使用PorterDuffXfermodePorterDuff这是一个圆角视图的示例。我不知道你想要什么,所以我只能给出我使用过的基本方法。另一个示例


剪切和绘图是两个非常不同的事情。 - JayVDiyk
@JayVDiyk,如果他写了它,它会产生相同的行为。 - Vyacheslav
@JayVDiyk,无论如何,我已经从这个网站添加了一个带有剪贴蒙版的示例。 - Vyacheslav
很酷,它们非常有帮助。我想奖励悬赏,但是SO说我必须等待24小时。感谢你的帮助!! - JayVDiyk
谢谢。我很高兴能够帮助到你。 - Vyacheslav
显示剩余2条评论

0

试试这个:

val circlePath = Path().apply {
        addCircle(x, y, radius, Path.Direction.CW)
    }
canvas.clipPath(circlePath)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接