Quartz2D之Path使用初步
// // MyQuartzView.m // QuartzTest // // Created by zenny_chen on 12-2-21. // Copyright (c) 2012年 GreenGames Studio. All rights reserved. // #import "MyQuartzView.h" // Quartz2D以及Core Animation所需要的头文件 #import <QuartzCore/QuartzCore.h> @implementation MyQuartzView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code // 创建Quartz上下文 CGContextRef context = UIGraphicsGetCurrentContext(); // 填充矩形 CGContextSetRGBFillColor(context, 0.6f, 0.6f, 0.6f, 1.0f); CGContextFillRect(context, CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)); // 创建一个Path句柄 CGMutablePathRef pathRef = CGPathCreateMutable(); // 初始化该path到一个初始点 CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f); // 添加一条直线,从初始点到该函数指定的坐标点 CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f); // 关闭该path CGPathCloseSubpath(pathRef); // 设置描边颜色 CGContextSetRGBStrokeColor(context, 0.99f, 0.01f, 0.02f,1.0f); // 将此path添加到Quartz上下文中 CGContextAddPath(context, pathRef); // 对上下文进行描边 CGContextStrokePath(context); // 释放该path CGPathRelease(pathRef); } @end
Quartz2D中对Path的绘制过程与OpenVG几乎一样。首先是创建Path,然后是对Path做绘制描述,最后是绘制(Paint)Path。
以上要注意的是,创建完一个Path句柄后,必须调用一次CGPathMoveToPoint来初始化绘制的初始点。
在调用CGPathMoveToPoint后,它会终止当前的子Path,并重新开启一个子Path。而一个子Path,其默认行为会构成一个封闭图形,比如以下代码:
// 创建一个Path句柄 CGMutablePathRef pathRef = CGPathCreateMutable(); // 初始化该path到一个初始点 CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f); // 添加一条直线,从初始点到该函数指定的坐标点 CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f); CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 100.0f, 50.0f); // 关闭该path CGPathCloseSubpath(pathRef);
添加了两条直线,但是最终绘制出来的是一个封闭的三角形。
如果我们要画两条均以(0, 0)为其中一个端点的线段的话,我们可以这么做:
// 创建一个Path句柄 CGMutablePathRef pathRef = CGPathCreateMutable(); // 初始化该path到一个初始点 CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f); // 添加一条直线,从初始点到该函数指定的坐标点 CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f); CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f); CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 100.0f, 50.0f); // 关闭该path CGPathCloseSubpath(pathRef);
如果我们要从(0, 0)到(50, 100)画一条线段,然后再要从(50, 100)到(100, 50)画一条线段的话,可以这么做:
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f); CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f); CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 100.0f, 50.0f);