当我们需要在一个图形上下文中构建一个路径时,我们需要调用CGContextBeginPath来标记Quartz。然后,我们调用函数CGContextMovePoint来设置每一个图形或子路径的起始点。在构建起始点后,我们可以添加直线、弧、曲线。记住如下规则:
- 在开始绘制路径前,调用函数CGContextBeginPath;
- 直线、弧、曲线开始于当前点。空路径没有当前点;我们必须调用CGContextMoveToPoint来设置第一个子路径的起始点,或者调用一个便利函数来隐式地完成该任务。
- 如果要闭合当前子路径,调用函数CGContextClosePath。随后路径将开始一个新的子路径,即使我们不显示设置一个新的起始点。
- 当绘制弧时,Quartz将在当前点与弧的起始点间绘制一条直线。
- 添加椭圆和矩形的Quartz程序将在路径中添加新的闭合子路径。
- 我们必须调用绘制函数来填充或者描边一条路径,因为创建路径时并不会绘制路径。
在绘制路径后,将清空图形上下文。我们也许想保留路径,特别是在绘制复杂场景时,我们需要反复使用。基于此,Quartz提供了两个数据类型来创建可复用路径—CGPathRef和CGMutablePathRef。我们可以调用函数CGPathCreateMutable来创建可变的CGPath对象,并可向该对象添加直线、弧、曲线和矩形。Quartz提供了一个类似于操作图形上下文的CGPath的函数集合。这些路径函数操作CGPath对象,而不是图形上下文。这些函数包括:
- CGPathCreateMutable,取代CGContextBeginPath
- CGPathMoveToPoint,取代CGContextMoveToPoint
- CGPathAddLineToPoint,取代CGContexAddLineToPoint
- CGPathAddCurveToPoint,取代CGContexAddCurveToPoint
- CGPathAddEllipseInRect,取代CGContexAddEllipseInRect
- CGPathAddArc,取代CGContexAddArc
- CGPathAddRect,取代CGContexAddRect
- CGPathCloseSubpath,取代CGContexClosePath
如果想要添加一个路径到图形上下文,可以调用CGContextAddPath。路径将保留在图形上下文中,直到Quartz绘制它。我们可以调用CGContextAddPath再次添加路径。
绘制路径
路径描边的函数
Quartz提供了表3-4中的函数来描边当前路径。其中一些是描边矩形及椭圆的便捷函数。
表3-4 描边路径函数
void CGContextSetLineDash
裁减图形上下文的函数
混合模式指定了Quartz如何将绘图绘制到背景上。Quartz默认使用普通混合模式(normal blend mode),该模式使用如下公式来计算前景绘图与背景绘图如何混合:
“颜色与颜色空间”章节里面详细讨论了颜色值的alpha组件,该组件用于指定颜色的透明度。在本章的例子中,我们可以假设颜色值是完全不透明的(alpha = 0)。对于不透明的颜色值,当我们用普通混合模式时,所有绘制于背景之上的绘图都会遮掩住背景。
我们可以调用函数CGContextSetBlendMode并传递适当的混合模式常量值来设置混合模式来达到我们想到的效果。记住混合模式是图形状态的一部分。如果调用了函数CGContextSaveGState来改变混合模式,则调用函数CGContextRestoreGState来重新设置混合模式为普通混合模式。
kCGBlendModeNormal
kCGBlendModeMultiply
kCGBlendModeScreen
kCGBlendModeOverlay
kCGBlendModeDarken
kCGBlendModeLighten
kCGBlendModeColorDodge
kCGBlendModeColorBurn
kCGBlendModeSoftLight
kCGBlendModeHardLight
kCGBlendModeDifference
kCGBlendModeExclusion
kCGBlendModeHue
kCGBlendModeSaturation
kCGBlendModeColor
kCGBlendModeLuminosity