ios 動畫與2D、3D繪圖

來源:互聯網
上載者:User

   主要是3種方式,Core Animation、Core Graphic和OpenGL ES。

   操作簡易度:CA>CG>OpenGL

   效能和功能度:OpenGL>CG>CA

 

1.Core Animation

  非娛樂類的軟體都會用到的動畫,操作簡單。

2.Quartz 2D繪圖

   是一個2D繪圖引擎。

  (1) 繪圖Context是一個繪圖的目標對象,定義了繪圖的基本屬性,如顏色、繪圖範圍、線寬及樣式等。

   (2)通過UIView會建立Context,可以用類似如下的語句來得到當前的Context.

   CGContextRef currentContext = UIGraphicsGetCurrentContext();

   (3)如果在對其進行修改前想要儲存目前狀態,可以使用UIGraphicsPushContext;

         要恢複儲存過的Context,則可用UIGraphicsPopContext。

   (4)path,路徑其實就是用一系列座標點標識出來的一條曲線或折線,建立好之後就可以沿其畫線,或者對封閉的空間進行填充。 

 

通過一個簡單的畫板(白板)來熟悉 Quartz 2D繪圖

 

添加一個Empty Application,建立一個UIView類

 在AppDelegate中修改代碼:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    
    //建立View,並指定View的大小為全屏
    WhiteBoardView *whiteView = [[WhiteBoardView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    [self.window addSubview:whiteView];//把建立的View作為子視圖加入視窗

    [whiteView release];
    
    [self.window makeKeyAndVisible];
    return YES;
}

 修改UIView類中代碼:

 

//  WhiteBoardView.h
//  DrawingBoard

#import <UIKit/UIKit.h>

@interface WhiteBoardView : UIView{
    
    CGContextRef whiteBoardContext;        
    CGLayerRef    whiteBoardLayer;        
    
}

@end

 

實作類別:

 

//  WhiteBoardView.m
//  DrawingBoard

#import "WhiteBoardView.h"

@implementation WhiteBoardView

//對進行重寫,以便在視圖初始化的時候建立並設定自訂的Context
- (id)initWithFrame:(CGRect)frame 
{        
    if (self = [super initWithFrame:frame]) {        
        
        self.backgroundColor = [UIColor whiteColor];//指定視圖的背景色    
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();    //指定色彩空間為RGB    
        
        //建立Bitmap Context,大小為View自身的大小
        whiteBoardContext = CGBitmapContextCreate(NULL, self.frame.size.width, self.frame.size.height, 8, 
                                                  4 *self.frame.size.width, colorSpace, kCGImageAlphaPremultipliedFirst);    
        CGColorSpaceRelease(colorSpace) ;    
        
        //建立新的CGLayer,用於畫圖
        whiteBoardLayer = CGLayerCreateWithContext(whiteBoardContext, self.frame.size, NULL);    
        
        //得到建立層的Context
        CGContextRef layerContext  = CGLayerGetContext(whiteBoardLayer);        
        
        //指定建立層Context的線寬
        CGContextSetLineWidth(layerContext, 1.5);        
        CGContextSetLineCap(layerContext, kCGLineCapRound);    //指定線頭形狀為圓形    
        CGContextSetRGBStrokeColor(layerContext, 0.0,0.0,0.0,1);//指定線的顏色,黑色
        
    }
    return self;    
}

//對drawRect進行重寫
- (void)drawRect:(CGRect)rect 
{    
    //先得到當前的Context
    CGContextRef currentContext = UIGraphicsGetCurrentContext();    
    
    //根據Context的內容產生Bitmap
    CGImageRef image = CGBitmapContextCreateImage(whiteBoardContext);
    //把Bitmap繪製到Context上
    CGContextDrawImage(currentContext, [self bounds], image);    
    //把whiteBoardLayer也繪到當前Context中
    CGContextDrawLayerInRect(currentContext    , [self bounds], whiteBoardLayer);    
    
}

//螢幕觸摸事件  觸摸開始
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{    
    UITouch *theTouch = [touches anyObject];//先得到touch對象                    
    if ([theTouch tapCount] == 2)//判斷是否為雙擊,是就清空映像
    {                                    
        CGContextClearRect(whiteBoardContext, [self bounds]);//清空    
    
        [self setNeedsDisplay];    //重新整理螢幕顯示
    }
    else//如果不是雙擊,就按手指划動處理,結果是畫出一個點
    {                                                            
        [self touchesMoved:touches withEvent:event];                
    }
}

//手指划動時畫線的代碼
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{    
    UITouch *theTouch = [touches anyObject];
    
    //得到當前位置
    CGPoint currentTouchLocation = [theTouch locationInView:self];    
    //得到上次位置
    CGPoint lastTouchLoacation = [theTouch previousLocationInView:self];
    
    //取得Context
    CGContextRef layerContext = CGLayerGetContext(whiteBoardLayer);        
    //開始定義Path
    CGContextBeginPath(layerContext);
    //把Path的起點移動到上次位置
    CGContextMoveToPoint(layerContext, lastTouchLoacation.x, lastTouchLoacation.y);
    //在上次位置和當前位置之間連線,並記入Path
    CGContextAddLineToPoint(layerContext, currentTouchLocation.x, currentTouchLocation.y);    
    //沿Path畫線
    CGContextStrokePath(layerContext);                                        
    
    [self setNeedsDisplay];    //重新整理螢幕                                                
    
}

- (void)dealloc 
{
    CGContextRelease(whiteBoardContext);                                    
    CGLayerRelease(whiteBoardLayer);                                    
    [super dealloc];
}

@end

 

 

 

3.OpenGL ES編程

  一般是三個步驟:

(1)在Context中繪圖

(2)把Context中的內容送入framebuffer

(3)顯示framebuffer 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.