在Android上我该如何制作奇怪形状的裁剪区域?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (66)

以下是如何创建一个裁剪区域的圆形状:

Path path = new Path();
path.addCircle(200,200,100,Direction.CW);
c.clipPath(path); // c is a Canvas

现在Canvas上有一个剪辑区域,可以防止在该圆圈的边界之外绘制任何东西。但是,如果我想让裁剪区域的形状像甜甜圈(或其他)呢?

我尝试过创建第二个路径并在其上使用toggleInverseFillType,然后将其添加到原始路径,但这似乎不起作用。

或者,不使用路径,是否可以创建一个位图用作遮罩,并以某种方式将其设置为Canvas上的剪贴遮罩?

作为参考,这里是我发现了6个不同的Region.Op值意味着什么。想象一下带有2个圆圈的维恩图。“B”是2个圆圈重叠的部分。“A”是不重叠的左圆。“C”是不重叠的右圆:

c.clipPath(a,Region.Op.REPLACE);
c.clipPath(b,???);

Region.Op.DIFFERENCE         -> A..            
Region.Op.INTERSECT          -> .B.            
Region.Op.REPLACE            -> .BC            
Region.Op.REVERSE_DIFFERENCE -> ..C            
Region.Op.UNION              -> ABC
Region.Op.XOR                -> A.C
提问于
用户回答回答于

Canvas javadoc可以看出:

Canvas#clipPath(Path path, Region.Op op) - 使用指定的路径修改当前剪辑。

对于你的例子:

  1. 创建2个路径。一个用于较大的圆圈,一个用于较小的圆圈。
  2. Canvas#clipPath( Path )与更大的圈子Path
  3. 使用第一个参数Canvas#clipPath( Path, Region.Op )的小圆圈PathRegion.Op第二个参数的适当枚举值调用画布上的方法: Path largePath = new Path(); largePath.addCircle(200,200,100,Direction.CW); Path smallPath = new Path(); smallPath.addCircle(200,200,40,Direction.CW); c.clipPath(largePath); // c is a Canvas c.clipPath(smallPath, Region.Op.DIFFERENCE);

扫码关注云+社区