以下是如何创建圆形的剪裁区域:
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
“。”表示未绘制的部分。对不起,如果不是特别清楚。没有图形很难很好地描述。
答案 0 :(得分:18)
来自Canvas
javadoc:
Canvas#clipPath(Path path, Region.Op op)
- 使用指定路径修改当前剪辑。
所以,对于你的甜甜圈示例:
Canvas#clipPath( Path )
圈子较大Path
。使用较小的圆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);
再次,修改Region.Op
枚举值以获得不同的效果......