2012-02-14 58 views
17

下面是如何创建剪贴面积的圆的形状:在Android上,我该如何制作怪异的剪辑区域?

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

现在有上防止绘制圆的边界之外的任何画布剪切区域。但是,如果我想让裁剪区域的形状像甜甜圈(或其他)呢?

我试着玩弄创建第二个路径并在其上使用toggleInverseFillType,然后将其添加到原始路径,但似乎没有工作。

另外,不是使用路径,而是可以创建一个位图用作掩码并以某种方式将其设置为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 

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

回答

18

Canvasjavadoc

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

所以,你的甜甜圈例如:

  1. 创建2条路径。一个用于较大的圆圈,一个用于较小的圆圈。
  2. Canvas#clipPath(Path)更大的圆圈Path
  3. 在您的画布上调用Canvas#clipPath(Path, Region.Op)方法,第一个参数的小圆圈为Path,第二个参数的适当的Region.Op枚举值为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); 
    

再次,修改Region.Op枚举值来获得不同的效果...不支持在Android

+0

clipPath如果禁用硬件加速您的视图/活动4 – Renetik 2013-05-16 19:58:27

+2

Clippath支持就好了, /应用。与Android 4+的区别在于HA默认启用。 – Plato 2013-06-24 12:21:22

+1

clipPath现在也是4.3以上的HA + – Ruxton 2013-08-20 09:56:51

相关问题