zoukankan      html  css  js  c++  java
  • Quartz2D的学习1

    1. Quartz概述

    Quartz是Mac OS X的Darwin核心之上的绘图层,有时候也认为是CoreGraphics(制图)。

    共有两种部分组成Quartz:

    Quartz Compositor,合成视窗系统,管理和合成幕后视窗影像来建立Mac OS X使用者接口。(了解,即幕后工作)

    Quartz 2D,是iOS和Mac OS X环境下的二维绘图引擎。(熟练,幕前工作,由我们来操作的)

    涉及内容包括:基于路径的绘图,透明度绘图,遮盖,阴影,透明层,颜色管理,防锯齿渲染,生成PDF,以及PDF元数据相关处理

    2. 绘制基本几何图形

    视图绘制

        在iOS上,所有的绘制,无论是否采用OpenGL、Quartz、UIKit、或者 Core Animation—都发生在UIView对象的区域内。

    视图定义绘制发生的屏幕区域。如果您使用系统提供的视图,绘制工作会自动得到处理(以前使用的UIView就是)。然而,如果您定义自己的定制视图,则必须自行提供绘制代码(今天要做的)。

    ps:

    OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。2d游戏图形引擎用的就是它

    视图绘制周期

    iPhone的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作,程序会自动调用此方法进行绘图。

        描绘系统会调用UIView对象的drawRect:方法,并向它传入一个包含需要重画的视图区域的矩形。

    在UIView中,重写drawRect: (CGRect) aRect方法,可以自己定义想要画的图案.且此方法一般情况下只会画一次.也就是说这个drawRect方法一般情况下只会被调用一次. 

    1.drawRect调用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在控制器中这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).

    2.如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。

    3.当某些情况下想要手动重画这个View,只需要掉用[self setNeedsDisplay]方法即可.

    setNeedsDisplay会调自动调用drawRect方法,这样可以拿到  UIGraphicsGetCurrentContext,就可以画画了。

    图形上下文

    在调用您提供的drawRect:方法之前,视图对象会自动配置其绘制环境,使您的代码可以立即进行绘制。作为这些

    配置的一部分,UIView对象会为当前绘制环境创建一个图形上下文(对应于CGContextRef封装类型)。

      该图形上下文包含绘制系统执行后续绘制命令所需要的信息,定义了各种基本的绘制属性,比如绘制使用的颜色、

    裁剪区域、线的宽度及风格信息、字体信息、合成选项、以及几个其它信息。

    绘制路径

      路径用于描述由一序列线和Bézier曲线构成的2D几何形状。Core Graphics中也有一些用于创建简单路径(比如矩形和椭圆形)的便利函数。对于更为复杂的路径,必须用Core Graphics框架提供的函数自行创建。

        //1.画线段

    //    [self drawLine:contenxtRef];

        //2.画三角形

    //    [self drawTriangle:contenxtRef];

        //3.画矩形

    //    [self drawRectWithContextRef:contenxtRef];

        //4.画圆

    //    [self drawCircle:contenxtRef];

        //5.扇形

    //    [self drawArc:contenxtRef];

        //6.曲线(贝塞尔曲线)

    贝塞尔曲线:

    Bézier曲线是法国数学家“贝塞尔”在工作中发现,任何一条曲线都可以通过与它相切的控制线两端的点的位置来定义。

    是应用于二维图形应用程序的数学曲线。

    也就是说,给个起点和终点,使用控制点就能确定一条曲线

    3. 绘制图像和文本

    UIImages的-drawRect:方法绘制图像:

    - [UIImage drawAtPoint:(CGPoint)point] 

    - [UIImage drawInRect:(CGRect)rect]

    - [UIImage drawAsPatternInRect:(CGRect)rect]

    NSString的-drawRect:方法绘制文本:  

    - (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs

    - (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs

    API整理

    1.  CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文  
    2.  CGContextMoveToPoint 开始画线  
    3.  CGContextAddLineToPoint 画直线  
    4.   
    5.  CGContextAddEllipseInRect 画一椭圆  
    6.  CGContextSetLineCap 设置线条终点形状  
    7.  CGContextSetLineDash 画虚线  
    8.  CGContextAddRect 画一方框  
    9.  CGContextStrokeRect 指定矩形  
    10.  CGContextStrokeRectWithWidth 指定矩形线宽度  
    11.  CGContextStrokeLineSegments 一些直线  
    12.   
    13.  CGContextAddArc 画已曲线 前俩店为中心 中间俩店为起始弧度 最后一数据为0则顺时针画 1则逆时针  
    14.  CGContextAddArcToPoint(context,0,0, 2, 9, 40);//先画俩条线从point 到 弟1点 , 从弟1点到弟2点的线  切割里面的圆  
    15.  CGContextSetShadowWithColor 设置阴影  
    16.  CGContextSetRGBFillColor 这只填充颜色  
    17.  CGContextSetRGBStrokeColor 画笔颜色设置  
    18.  CGContextSetFillColorSpace 颜色空间填充  
    19.  CGConextSetStrokeColorSpace 颜色空间画笔设置  
    20.  CGContextFillRect 补充当前填充颜色的rect  
    21.  CGContextSetAlaha 透明度  
    22.   
    23.  CGContextTranslateCTM 改变画布位置  
    24.  CGContextSetLineWidth 设置线的宽度  
    25.  CGContextAddRects 画多个线  
    26.  CGContextAddQuadCurveToPoint 画曲线  
    27.  CGContextStrokePath 开始绘制图片  
    28.  CGContextDrawPath 设置绘制模式  
    29.  CGContextClosePath 封闭当前线路  
    30.  CGContextTranslateCTM(context, 0, rect.size.height);    CGContextScaleCTM(context, 1.0, -1.0);反转画布  
    31.  CGContextSetInterpolationQuality 背景内置颜色质量等级  
    32.  CGImageCreateWithImageInRect 从原图片中取小图  
    33.   
    34. //字符串的 写入可用  nsstring本身的画图方法   
    35.  -(CGSize)drawInRect:(CGRect)rect   
    36.             withFont:(UIFont *)font   
    37.        lineBreakMode:(UILineBreakMode)lineBreakMode   
    38.            alignment:(UITextAlignment)alignment;来写进去即可  
    39.   
    40. //对图片放大缩小的功能就是慢了点  
    41.  UIGraphicsBeginImageContext(newSize);  
    42.  UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();  
    43.  UIGraphicsEndImageContext();  
    44.   
    45.  CGColorGetComponents() 返回颜色的各个直 以及透明度 可用只读const float 来接收  是个数组  
    46.   
    47. //画图片   
    48.  CGImageRef image=CGImageRetain(img.CGImage);  
    49.  CGContextDrawImage(context, CGRectMake(10.0, height - 100.0, 90.0, 90.0), image);  
    50.   
    51. //实现逐变颜色填充方法 CGContextClip(context);  
    52.  CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();  
    53.  CGFloat colors[] =  
    54.     {  
    55.         204.0 / 255.0, 224.0 / 255.0, 244.0 / 255.0, 1.00,  
    56.         29.0 / 255.0, 156.0 / 255.0, 215.0 / 255.0, 1.00,  
    57.         0.0 / 255.0,  50.0 / 255.0, 126.0 / 255.0, 1.00,  
    58.     };  
    59.  CGGradientRef gradient = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));  
    60.  CGColorSpaceRelease(rgb);      
    61.  CGContextDrawLinearGradient(context, gradient,CGPointMake(0.0,0.0) ,CGPointMake(0.0,self.frame.size.height),                      
    62.     kCGGradientDrawsBeforeStartLocation);  
    63.       
    64. //注:  画完图后,必须  
    65.     先用CGContextStrokePath来描线,即形状  
    66.     后用CGContextFillPath来填充形状内的颜色.  
    67.   
    68. //填充一个路径的时候,路径里面的子路径都是独立填充的。  
    69. //假如是重叠的路径,决定一个点是否被填充,有两种规则  
    70.  1,nonzero winding number rule:非零绕数规则,假如一个点被从左到右跨过,计数器+1,从右到左跨过,计数器-1,最后,如果结果是0,那么不填充,如果是非零,那么填充。  
    71.  2,even-odd rule: 奇偶规则,假如一个点被跨过,那么+1,最后是奇数,那么要被填充,偶数则不填充,和方向没有关系。  
    72.   
    73.    
    74.  CGContextEOFillPath //使用奇偶规则填充当前路径  
    75.  CGContextFillPath //使用非零绕数规则填充当前路径  
    76.  CGContextFillRect //填充指定的矩形  
    77.  CGContextFillRects //填充指定的一些矩形  
    78.  CGContextFillEllipseInRect //填充指定矩形中的椭圆  
    79.  CGContextDrawPath //两个参数决定填充规则,kCGPathFill表示用非零绕数规则,kCGPathEOFill表示用奇偶规则,kCGPathFillStroke表示填充,kCGPathEOFillStroke表示描线,不是填充  
    80.   
    81.   
    82. //设置当一个颜色覆盖上另外一个颜色,两个颜色怎么混合  
    83. //默认方式是  
    84.  result = (alpha * foreground) + (1 - alpha) * background  
    85.   
    86.  CGContextSetBlendMode :设置blend mode.  
    87.  CGContextSaveGState :保存blend mode.  
    88.  CGContextRestoreGState:在没有保存之前,用这个函数还原blend mode.  
    89.  CGContextSetBlendMode 混合俩种颜色 
  • 相关阅读:
    Redmine:数据库的账号密码配置
    EF:自定义Oracle的映射类型
    WCF:调用超时
    ibator使用心得
    Mantis部署步骤
    Detach之后的POCO如何Attach以及LoadProperty
    快速迭代与原型开发
    .net framework 4.0无法在Win7下安装的解决办法
    MVC和MVP的一些思考
    从类模型转换到数据库表结构的思考
  • 原文地址:https://www.cnblogs.com/sdutmyj/p/4786962.html
Copyright © 2011-2022 走看看