2

我画了两个重叠的圆圈。我希望能够将它们填充和描边作为合并的新形状。

目前,我创建了一次路径序列,对其进行描边,然后创建一个副本,填充它并将两条相同的路径叠加在一起,使它们显示为一个形状。有更好的方法还是可以?

更新:这是一个示例代码:

CGMutablePathRef path = CGPathCreateMutable();

CGContextSetStrokeColorWithColor(theContext, strokeColor.CGColor);
CGContextSetLineWidth(theContext, 2);
CGContextSetFillColorWithColor(theContext, fillColor.CGColor);

CGRect rect1 = CGRectMake(0,0, mySize*0.6, mySize*0.6);
CGRect rect2 = CGRectMake(mySize*0.4,0, mySize*0.6, mySize*0.6);

CGPathAddEllipseInRect(path, NULL, rect1);
CGPathAddEllipseInRect(path, NULL, rect2);

CGContextAddPath(theContext, path);
CGContextDrawPath(theContext, kCGPathFillStroke);

CGPathRef pathFill = CGPathCreateCopy ( path );
CGContextAddPath(theContext, pathFill);
CGContextDrawPath(theContext, kCGPathFill);

CGPathRelease(path);
CGPathRelease(pathFill);

如您所见,我创建了原始路径的副本并在没有笔划的情况下将其绘制在顶部,因此最终它看起来像一个统一的形状。有没有办法避免创建重复?

4

1 回答 1

3

有没有办法避免创建重复?

是的:只是不要创建它。

Core Graphics 中的路径对象是路径,仅此而已。它们没有颜色、没有图案、没有填充或描边属性,什么都没有——只有由 moveto、lineto、curveto 和 closepath 段组成的子路径。

填充颜​​色、描边颜色、线宽等都是上下文中图形状态的属性。当前路径也是上下文的属性(但不是 gstate)。

当您将路径添加到上下文时,您所做的就是:将路径对象中的子路径添加到上下文中的当前路径中。原路径对象保持不变;它没有图形状态,即使有,“从路径添加子路径到上下文”操作会更改上下文,而不是路径对象。

类似地,填充或抚摸上下文的当前路径只会重置上下文的当前路径;它不会更改您可能用于构建该路径的任何路径对象。如果是这样,那么复制路径就太晚了,因为原来的路径已经被改变了——但它没有,所以复制路径是不必要的。

因此,只需将相同的路径对象添加到当前路径两次。

于 2010-08-22T04:54:14.593 回答