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. 繪製基本幾何圖形spa

視圖繪製htm

    在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 混合倆種顏色 
相關文章
相關標籤/搜索