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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM