zoukankan      html  css  js  c++  java
  • CoreGpaphics

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

    //(10, 10) 起点, (50, 100) 中点, (100, 10)终点
        CGPathAddCurveToPoint(mutablePathRef, NULL, 10, 10, 50, 100, 100, 10);
        CGContextAddPath(contextRef, mutablePathRef);
        CGContextSetStrokeColorWithColor(contextRef, [UIColor redColor].CGColor);
        CGContextSetLineWidth(contextRef, 2);
        CGContextDrawPath(contextRef, kCGPathFillStroke);
  • 相关阅读:
    Notes about "Exploring Expect"
    Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
    Eclipse带参数调试的方法
    MIT Scheme Development on Ubuntu
    Manage Historical Snapshots in Sonarqube
    U盘自动弹出脚本
    hg的常用配置
    Java程序员的推荐阅读书籍
    使用shared memory 计算矩阵乘法 (其实并没有加速多少)
    CUDA 笔记
  • 原文地址:https://www.cnblogs.com/apem/p/4342236.html
Copyright © 2011-2022 走看看