CoreGpaphics基本应用

CGAffineTransformMake开头的函数 是基于最初始的位置来变化的

带有CGAffineTransform参数是基于CGAffineTransform的位置变化的

CGAffineTransformIdentify就是原来没有变化前的位置

主要函数有:

CG_EXTERN const CGAffineTransform CGAffineTransformIdentity
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Return the transform [ a b c d tx ty ]. */ CG_EXTERN CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloat b,
CGFloat c, CGFloat d, CGFloat tx, CGFloat ty)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Return a transform which translates by `(tx, ty)':
t' = [ 1 0 0 1 tx ty ] */ CG_EXTERN CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,
CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Return a transform which scales by `(sx, sy)':
t' = [ sx 0 0 sy 0 0 ] */ CG_EXTERN CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Return a transform which rotates by `angle' radians:
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] */ CG_EXTERN CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Return true if `t' is the identity transform, false otherwise. */ CG_EXTERN bool CGAffineTransformIsIdentity(CGAffineTransform t)
CG_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0); /* Translate `t' by `(tx, ty)' and return the result:
t' = [ 1 0 0 1 tx ty ] * t */ CG_EXTERN CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t,
CGFloat tx, CGFloat ty) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Scale `t' by `(sx, sy)' and return the result:
t' = [ sx 0 0 sy 0 0 ] * t */ CG_EXTERN CGAffineTransform CGAffineTransformScale(CGAffineTransform t,
CGFloat sx, CGFloat sy) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Rotate `t' by `angle' radians and return the result:
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] * t */ CG_EXTERN CGAffineTransform CGAffineTransformRotate(CGAffineTransform t,
CGFloat angle) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /* Invert `t' and return the result. If `t' has zero determinant, then `t'
is returned unchanged. */ CG_EXTERN CGAffineTransform CGAffineTransformInvert(CGAffineTransform t)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);

重写drawRect 只能写在所有视图的父类 UIView,

UIImageView等视图是不允许重写的

- (void)drawRect:(CGRect)rect

{

[super drawRect:rect];

UIBezierPath *bezierPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(50, 50) radius:50 startAngle:0 endAngle:2 * M_PI clockwise:YES];

CAShapeLayer *caShapeLayer = [CAShapeLayer layer];

caShapeLayer.path = bezierPath.CGPath;

caShapeLayer.fillColor = [UIColor redColor].CGColor;

[self.layer addSublayer:caShapeLayer];

NSString *attrString =@"hellohellohellohellohellohellohellohellohello";

UIColor *stringColor = [UIColor colorWithRed:1.0 green:0.0f blue:0 alpha:1.0];  //设置文本的颜色

NSDictionary* attrs =@{NSForegroundColorAttributeName:stringColor,

NSFontAttributeName:[UIFont fontWithName:@"AmericanTypewriter"size:18],

}; //在词典中加入文本的颜色 字体 大小

[attrString drawInRect:CGRectMake(0,0,50,50)withAttributes:attrs]; //给文本限制个矩形边界,防止矩形拉伸;

NSString *s = @"我的小狗";

[s drawAtPoint:CGPointMake(100, 0) withFont:[UIFont systemFontOfSize:34.0]];

}

CGContextRef context= UIGraphicsGetCurrentContext();
CGContextAddEllipseInRect(context, CGRectMake(10, 100, 300, 280));
CGContextSetFillColorWithColor(context, [UIColor orangeColor].CGColor);
CGContextFillPath(context); CGRect rectangle = CGRectMake(100, 290, 100, 25);
CGContextAddRect(context, rectangle);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextFillPath(context); CGContextBeginPath(context);
CGContextMoveToPoint(context, 160, 220);
CGContextAddLineToPoint(context, 190, 260);
CGContextAddLineToPoint(context, 130, 260);
CGContextClosePath(context);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextFillPath(context); CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextAddArc(context, 120, 170, 25, 0 * M_PI, 2 * M_PI, YES);
CGContextFillPath(context); CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextAddArc(context, 200, 170, 25, 0 * M_PI, 2 * M_PI, YES);
CGContextFillPath(context); CGContextBeginPath(context);
CGContextMoveToPoint(context, 160, 100);
CGContextAddQuadCurveToPoint(context, 160, 50, 190, 50);
CGContextSetLineCap(context, kCGLineCapSquare);
CGContextSetLineWidth(context, 20);
CGContextStrokePath(context);
CGContextSetStrokeColorWithColor(context, [UIColor brownColor].CGColor);
CGContextClosePath(context);

画图动画:

UIBezierPath *topBezierPath = [UIBezierPath bezierPath];
[topBezierPath moveToPoint:CGPointMake(160, 100)];
[topBezierPath addQuadCurveToPoint:CGPointMake(190,50) controlPoint:CGPointMake(160, 50)];
topBezierPath.lineCapStyle = kCGLineCapSquare;
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = topBezierPath.CGPath;
shapeLayer.fillColor = [UIColor clearColor].CGColor;
shapeLayer.strokeColor = [UIColor brownColor].CGColor;
shapeLayer.lineWidth = 20; CABasicAnimation *theAnimation;
theAnimation=[CABasicAnimation animationWithKeyPath:@"strokeEnd"];
theAnimation.delegate = self;
theAnimation.duration = 2;
theAnimation.removedOnCompletion = FALSE;
theAnimation.fromValue = [NSNumber numberWithFloat:0];
theAnimation.toValue = [NSNumber numberWithFloat:2];
[shapeLayer addAnimation:theAnimation forKey:@"animateLayer"]; [self.layer addSublayer:shapeLayer];

白板画图:

通过一个简单的画板(白板)来熟悉 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

二.CGPath的使用

CGContextRef contextRef = UIGraphicsGetCurrentContext();

CGPathMoveToPoint(mutablePathRef, NULL, , );

//(10, 10) 起点, (50, 100) 中点, (100, 10)终点
CGPathAddCurveToPoint(mutablePathRef, NULL, , , , , , );
CGContextAddPath(contextRef, mutablePathRef);
CGContextSetStrokeColorWithColor(contextRef, [UIColor redColor].CGColor);
CGContextSetLineWidth(contextRef, );
CGContextDrawPath(contextRef, kCGPathFillStroke);

CoreGpaphics的更多相关文章

随机推荐

  1. oracle存储过程中使用字符串拼接

    1.使用拼接符号“||” v_sql := 'SELECT * FROM UserInfo WHERE ISDELETED = 0 AND ACCOUNT =''' || vAccount || '' ...

  2. 【grpc】项目启动缺少grpc架包引用

    项目启动缺少grpc架包引用 导致 项目无法启动 解决方法: 在命令行执行 ./gradlew generateProto 下载完成之后  刷新gradle或者maven 再重启项目

  3. win7安装ANT

    点击进入ant官网,找到下载选项.   选择下载安装文件.其余的源文件和手册的下载步骤完全相同.   可以下载官网上对应系统的最新版本.也可以在old ant 版本中选择自己需要的版本.笔者需要ant ...

  4. k-svd字典学习,稀疏编码

    1.     K-SVD usage: Design/Learn a dictionary adaptively to betterfit the model and achieve sparse s ...

  5. Spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)

    近期上班太忙所以耽搁了给大家分享实战springboot 框架的使用. 以下是spring boot 整合多个框架的使用. 首先是准备工作要做好. 第一  导入框架所需的包,我们用的事maven 进行 ...

  6. hdu 1679 The Unique MST (克鲁斯卡尔)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24152   Accepted: 8587 D ...

  7. 生活娱乐 Wifi机器人的制作流程

    思路简单,但是创意无限~~ 动手能力超强 牛人教你做Wifi机器人(图) 一.前言 Wifi机器人(Wifi Robot):其实是一辆能通过互联网,或500米以外的笔记本无线设施来远程控制的遥控汽车. ...

  8. 创建一个简单的 http 服务器

    创建一个简单的 http 服务器 直接在 目录下运行 当前的目录即可是root 目录 默认端口8000 应该可以加参数修改端口号 Python2 python -m SimpleHTTPServer ...

  9. Android四大组件的生命周期

    介绍生命周期之前,先提一下任务的概念 任务其实就是activity 的栈它由一个或多个Activity组成的共同完成一个完整的用户体验, 换句话说任务就是” 应用程序” (可以是一个也可以是多个,比如 ...

  10. Android手机输入法按键监听-dispatchKeyEvent

    近期在项目开发中遇到一个关于手机输入键盘的坑.特来记录下. 应用场景: 项目中有一个界面是用viewpaper加三个fragment写的,当中viewpaper被我屏蔽了左右滑动,上面有三个点击按钮, ...