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

时间:2012-02-14 22:55:14

标签: android android-canvas dalvik masking

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

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

现在Canvas上有一个剪裁区域,可以防止在该圆圈范围之外绘制任何东西。但是,如果我想将剪裁区域塑造成甜甜圈(或其他什么),该怎么办?

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

或者,不是使用Path,而是可以创建一个Bitmap用作蒙版并以某种方式将其设置为Canvas上的剪贴蒙版?

编辑:答案正是我需要的一个小补充。在画布上执行多个操作时,请始终在第一个clipPath调用上使用Op.REPLACE。这将取代该Canvas上的任何现有clipPath。

作为参考,我在这里发现了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

“。”表示未绘制的部分。对不起,如果不是特别清楚。没有图形很难很好地描述。

1 个答案:

答案 0 :(得分:18)

来自Canvas javadoc

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

所以,对于你的甜甜圈示例:

  1. 创建2个路径。一个用于较大的圆圈,一个用于较小的圆圈。
  2. Canvas#clipPath( Path )圈子较大Path
  3. 使用较小的圆Canvas#clipPath( Path, Region.Op )为第一个参数调用Path方法,并为第二个参数调用相应的Region.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);
    
  4. 再次,修改Region.Op枚举值以获得不同的效果......