【问题标题】:Can I clip a view with a circle using setClipBounds?我可以使用 setClipBounds 剪辑带有圆圈的视图吗?
【发布时间】:2016-02-26 20:29:40
【问题描述】:

我有以下代码来划分要绘制的视图区域:

Rect rect = new Rect();
rect.set(0, 0, 100, 100);
View.setClipBounds(rect);

这将仅在指定的矩形(或正方形,在这种情况下)上绘制我的视图。但是,我希望将视图裁剪为一个圆圈。有什么办法可以使 Rect 对象的角变圆?

【问题讨论】:

  • 我的选项中最好的选择是覆盖视图的 onDraw 并使用 drawPath 例如路径是圆角矩形。

标签: android


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

    在这种情况下,您必须对该视图进行子类化并向其添加一些额外的逻辑。

    将这些代码添加到它的构造方法,或者任何你想初始化视图的地方。

    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://stackoverflow.com/a/7559233/1841194

    【讨论】:

      【解决方案3】:

      尝试使用

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

      about 或方形。

      另一种方法是使用剪贴蒙版。这个想法的概念是使用 PorterDuffXfermodePorterDuffThis is 圆角视图的示例。我不知道您直接想要什么,这就是为什么我可以提供我使用过的基本方法。 The other example.

      【讨论】:

      • 剪辑和绘图是两种截然不同的东西
      • @JayVDiyk ,如果他写了它会给出相同的行为。
      • 它服务的目的不同。
      • @JayVDiyk,无论如何,我已经从这个站点添加了一个带有剪贴蒙版的示例。
      • @JayVDiyk,我在PorterDuff 示例中附加了两个链接。
      猜你喜欢
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      相关资源
      最近更新 更多