iphone中Quarz 2D的使用
1.可以依靠两个不同的库来满足我们绘图的需要,一个库是Quartz 2D,它是Core Graphics框架的一部分;另一个库是OpenGL ES,它是跨平台的图形库。
2.OpenGL ES是跨平台图形库OpenGL的简化版、OpenGL ES是OpenGL的一个子集,OpenGL ES是专为iphone之类的嵌入式系统(因此缩写为字母ES)设计的。
3.Quartz是一组函数、数据类型以及对象,专门用于直接在内存中对视图或图像进行绘制。Quartz将正在绘制的视图或图像视为一个虚拟的画布,并遵循所谓的绘画者模型。
4.OpenGL ES以状态机的形式实现,OpenGL ES不允许执行直接影响视图、窗口或图像的操作,它维护一个虚拟的三维世界。当向这个世界中添加对象时,OpenGL会跟踪所有对象的状态
5.Quartz相对比较容易使用。它提供了各种直线、形状以及图像绘制函数。尽管易于使用,但Quartz 2D仅限于二维绘图。尽管许多Quartz函数会在绘图时利用硬件加速,但无法保证在Quartz中执行的任何操作都得到了加速。
6.尽管OpenGL非常复杂,并且概念上也比较难理解,但是它的强大性是毫无疑问的。它同时提供了二维和三维绘图工具。他经过专门设计,目的是为了充分利用硬件加速。它还非常适用于编写游戏和其他复杂的、图形密集的程序。
7.使用Quartz绘制图形时,通常会向绘制图形的视图中添加绘图代码。例如,可能会创建UIView的子类。并向该类的drawRect:方法中添加Quartz函数调用。drawRect:方法是UIView类定义的一部分,并且每次需要重绘视图时都会调用该方法。如果在drawRect:中插入Quartz代码,则会先调用改代码,然后重绘视图。
7.在Quartz 2D中,和在其他Core Graphics中一样,绘图是在图形上下文中进行的,通常,只称为上下文。
8下面这行代码将检索当前上下文:
CGContextRef context=UIGraphicsGetCurrentContext();
9.我们使用Core Graphics C函数,而不是使用Objective-C对象来绘图。Core Graphics和OpenGL都是基于C的API的,因此大多数代码将由C函数调用组成。
10.在Core Graphics中,有两种颜色与绘图操作关联:笔画颜色和填充颜色。笔画颜色用于绘制直线以及形状的轮廓,填充颜色用于填充形状。
11.根据苹果公司发布的“iPhone人机界面指南”,导航栏是专门放在屏幕顶部的,而工具栏则是专门放在底部的。
11.如果想在iphone应用程序中,使用Quartz来绘制图形,需要在view中添加drawRect方法。drawRect方法是系统的方法
-(void) drawRect:(CGRect) rect{
……
}
12. -(void) drawRect:(CGRect *) rect{
//得到当前上下文
CGContextRef context=UIGraphicsGetCurrentContext();
//设置画笔的宽度
CGContextSetLineWidth(context,2.0);
//设置画笔的颜色
CGContextSetStrokeColorWithColor(context, self.currentColor.CGColor);
//设置画笔的画出图形的填充色
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
switch (shapeType) {
//绘制直线
case kLineShape:
//从哪一点开始
CGContextMoveToPoint(context,firstTouch.x,firstTouch.y);
//到哪一点结束
CGContextAddLineToPoint(context, lastTouch.x,lastTouch.y);
//绘制
CGContextStrokePath(context);
break;
//绘制长方形(正方形)
case kRectShape:
//在当前用户滑动的文本框内添加一个长方形(正方形)
CGContextAddRect(context, [self getRect]);
//绘制
CGContextDrawPath(context, kCGPathFillStroke);
break;
//绘制圆形
case kEllipseShape:
//在当前用户滑动的文本框内添加一个圆形
CGContextAddEllipseInRect(context, [self getRect]);
CGContextDrawPath(context, kCGPathFillStroke);
break;
//绘制图形 其中drawImage是UIImage类型
case kImageShape:{
//设置水平偏移量
CGFloat horizontalOffset=drawImage.size.width/2;
//设置数值偏移量
CGFloat verticalOffset=drawImage.size.height/2;
CGPoint drawPoint=CGPointMake(lastTouch.x-horizontalOffset,lastTouch.y-verticalOffset);
//开始绘制
[drawImage drawAtPoint:drawPoint];
break;}
default:
break;
}
}
以下是代码:
在UIView的子类中添加如下代码 - (void)drawRect:(CGRect)rect { //得到当前上下文 CGContextRef context=UIGraphicsGetCurrentContext(); //设置画笔的粗细 CGContextSetLineWidth(context, 2); //设置画笔的颜色 CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); //设置填充色 CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor); //画线 [self drawLine:context]; //画矩形 [self drawrectShape:context]; //画圆 [self drawEllipseShape:context]; //画图片 [self drawImage]; //写字 [self drawText]; //画弧形 [self drawArc:context]; } //画线 -(void) drawLine:(CGContextRef) context{ UIGraphicsPushContext(context); //将画笔移动至点x=20 y=20 CGContextMoveToPoint(context, 20, 20); //将画笔从点x=20 y=20 移动至点 x=300 y=300 CGContextAddLineToPoint(context, 300, 300); //画线 CGContextStrokePath(context); UIGraphicsPopContext(); } //画矩形 -(void) drawrectShape:(CGContextRef) context{ UIGraphicsPushContext(context); //添加一个CGRect为(30, 190, 100, 50)的矩形 CGContextAddRect(context, CGRectMake(30, 190, 100, 50)); //画矩形 第二个参数可以为:kCGPathFill,kCGPathEOFill,kCGPathStroke,kCGPathFillStroke,kCGPathEOFillStroke 表示填充的方式 CGContextDrawPath(context, kCGPathFillStroke); UIGraphicsPopContext(); } //画圆 -(void) drawEllipseShape:(CGContextRef) context{ UIGraphicsPushContext(context); //添加一个在矩形CGRect区域(80, 30, 100, 50)中的圆 CGContextAddEllipseInRect(context, CGRectMake(80, 30, 100, 50)); CGContextDrawPath(context, kCGPathFillStroke); UIGraphicsPopContext(); } //写字 -(void) drawText{ UIFont *font=[UIFont fontWithName:@"Arial" size:16.0]; NSString *str=[[NSString alloc] initWithString:@"大家好!"]; [[UIColor yellowColor] set];//设置字体颜色 [str drawAtPoint:CGPointMake(100, 100) withFont:font]; [str release]; } //画图片 -(void) drawImage{ UIImage *image=[UIImage imageNamed:@"money.png"]; [image drawInRect:CGRectMake(20, 100, 100, 100)]; } //画弧形 -(void) drawArc:(CGContextRef) context{ CGContextBeginPath(context); CGContextSetRGBStrokeColor(context, 0, 1, 0, 1); //第一个参数context为当前上下文,第二个参数和第三个参数为圆心坐标点,第四个参数为半径, //第五个参数和第六个参数是开始的弧度和结束的弧度,最后一个参数0表示顺时针,1表示逆时针 CGContextAddArc(context, 100, 100, 100, 0* PI/ 180, 360* PI/ 180, 0); CGContextStrokePath(context); }