• 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);        
     }
    

      

  • 相关阅读:
    promise封装微信小程序的request
    css3实现loading效果--当页面加载过程中显示Loading的进度条,全部加载完成之后进度条消失
    解决H5微信浏览器中audio兼容-- 背景音乐无法自动播放
    h5微信浏览器复制粘贴--ios兼容问题的解决方法(clipboard.js插件)
    解决微信二次分享失败--后面被加上from=singlemessage&isappinstalled=0的解决方案
    h5微信分享
    mpvue微信小程序项目踩坑记录
    水塘抽样算法
    Redis批量删除脚本
    java9 模块化 jigsaw
  • 原文地址:https://www.cnblogs.com/greywolf/p/2618875.html
Copyright © 2020-2023  润新知