Quartz 2D 使用路径(2)

来源:互联网 发布:小米机器人编程 编辑:程序博客网 时间:2024/06/16 14:55

除此之外,Quartz 2D还提供了如下函数来获取当前CGContextRef所包含的路径信息。

bool CGContextIsPathEmpty(CGContextRef c):该函数用于判断指定CGContextRef包含的路径是否为空。

CGPoint CGContextGetPathCurrentPoint(CGContextRef c):该函数用于返回指定CGContextRef包含的路径的当前点。

CGRect CGContextGetPathBoundingBox(CGContextRef c):该函数用于返回指定CGContextRef中能完整包围所有路径的最小矩形。

bool CGContextPathContainsPoint(CGContextRef context, CGPoint point, CGPathDrawingMode mode):该函数判断指定CGContextRef包含的路径按指定绘制模式进行绘制时,是否需要绘制point点。

为了在Canvas中使用路径,可按如下步骤进行。

调用CGContextBeginPath()函数开始定义路径。

调用表12.4所示的各种函数添加子路径。

如果路径添加完成,调用CGContextClosePath()函数关闭路径。

调用CGContextDrawPath()、CGContextEOFillPath()、CGContextFillPath()或CGContextStrokePath()函数来填充路径或绘制路径边框即可。在这些方法中,第一个方法可以代替后面的几个方法,第一个方法指定使用特定的模式来绘制图形,它支持如下几种绘制方式。

kCGPathFill:指定填充路径。相当于CGContextFillPath()函数。

kCGPathEOFill:指定采用even-odd模式填充路径。相当于CGContextEOFillPath()函数。

kCGPathStroke:指定只绘制路径。相当于CGContextStrokePath()函数。

kCGPathFillStroke:指定既绘制路径,也填充路径。如果采用这种绘制方式,必须使用该函数。

kCGPathEOFillStroke:指定既绘制路径,也采用even-odd模式填充路径。如果采用这种绘制方式,必须使用该函数。

通过上面介绍的CGContextAddArc()函数,我们可以绘制扇形,下面的程序代码使用循环绘制了10个扇形,而且这10个扇形的透明度逐渐降低。首先创建一个Single View Application,该Application包含一个应用程序委托代理类、一个视图控制器和配套的Storyboard界面设计文件。将该界面设计文件中最大的View改为使用自定义的FKArcView类。该程序的控制器类几乎无须修改,只要重写FKArcView的drawRect:方法,在该方法中使用路径绘制扇形即可。

下面是FKArcView类的实现代码。

程序清单:codes/12/12.2/AddArcTest/AddArcTest/FKArcView.m
 

  1. @implementation FKArcView  
  2.  
  3. - (void)drawRect:(CGRect)rect  
  4. {  
  5.     CGContextRef ctx = UIGraphicsGetCurrentContext();  
  6.     for(int i = 0 ; i < 10 ; i++)  
  7.     {     
  8.         CGContextBeginPath(ctx);  // 开始定义路径  
  9.         // 添加一段圆弧,最后一个参数1代表逆时针,0代表顺时针  
  10.         CGContextAddArc(ctx , i * 25 , i * 25, (i + 1) * 8 , M_PI * 1.5 , M_PI , 0);  
  11.         CGContextClosePath(ctx);  // 关闭路径  
  12.         CGContextSetRGBFillColor(ctx, 1, 0, 1, (10 - i) * 0.1);  // 设置填充颜色  
  13.         CGContextFillPath(ctx);  // 填充当前路径  
  14.     }  
  15. }  
  16. @end 

上面程序中的粗体字代码绘制了从M_PI * 1.5角度(12点方向)开始,到M_PI角度(9点方向)结束的扇形--在该绘图API中0度代表X轴方向(也就是3点方向)。需要指出的是,关于CGContextAddArc()函数的最后一个参数,官方文档介绍该参数为0代表逆时针,但笔者运行时看到的效果是0代表顺指针(可参见下面的运行效果)。

编译、运行该程序,可以看到如图12.7所示的效果。

从上面程序的运行结果来看,相信读者对CGContextAddArc (CGContextRef c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)函数的用法已经比较清楚,该方法的第2、3个参数指定圆弧的圆心,第4个参数用于设置圆弧的半径,第5、6个参数则用于设置圆弧的开始角度、结束角度,最后一个参数用于设置是否顺时针旋转。

可能有读者对CGContextAddArcToPoint(CGContextRef c, CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2, CGFloat radius)函数感到疑惑,该方法也是添加一段圆弧路径。确定这段圆弧的方式是:假设从当前点到P1(x1、y1)绘制一条线条,再从 P1(x1、y1)到P2(x2、y2)绘制一条线条,CGContextAddArcToPoint()则绘制一条同时与上面两条线条相切且半径为radius的圆弧。该函数方法的示意图如图12.8所示。
 


0 0
原创粉丝点击