• Quartz2D之绘制一个简单的机器猫


    学习iOS有一段时间了,在博客园也默默的潜水了两个月,见识了很多大神,收获不少。

    今天整理笔记,发现忘记的不少,我感觉需要及时的整理一下了,同时也把做的小东西贴上来和大家分享一下。

    最近学习了Quartz2D,一款二维绘图引擎,可以用于绘制各种图形、文字、图片等,并且具备裁剪、生成图片、自定义UI控件等功能,据说iOS很多UI控件都是通过它画出来的。

    但是在美工如此强大的今天,并不需要利用Quartz2D画出多么美观的界面,而是利用它来做一些程序运行时美工无法实现或者相对麻烦的功能,比如动态绘图(涂鸦板、K线图等各种分析类图表)、裁剪图片、手势解锁等。

    出于一个曾经美工的执念,我使用Quartz2D画了一个简单的机器猫头像,关于Quartz2D的基础绘制知识,博客园很多,我就直接贴出绘制过程了;

    1、我是直接新建了一个view,直接在drawRect方法中取得图层上下文进行绘制,也可以直接创建一个基于位图的上下文,从上下文中取得制作完毕的UIImage对象。首先获取和view相关的图形上下文,设定线条样式,并且保存了一份在上下文栈中,以防后面需要用到。其中每个部分的位置参数,就不仔细说明了,简单计算和尝试即可,每个人都有自己的设置方法;注意要把描边厚度考虑进去,线段厚度设置方式是里外各增加相同厚度,我这里设置的线段厚度为4,比如大圆的实际半径为:我们设置的大圆半径加上2才是正确的,所以有些参数+-2;

    -(void)drawRect:(CGRect)rect
    {
        //获取上下文,no *;
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        //设置线宽为4,即描边
        CGContextSetLineWidth(ctx, 4);
        //线条颜色为黑色
        [[UIColor blackColor]setStroke];
        //保存一份原始的上下文栈
        CGContextSaveGState(ctx);

    2、开始画头部:头部由两个圆形组成。一个蓝色大圆,以及中心点靠下的白色小圆:

        //设置中心点,根据中心点设置参数
        CGFloat viewW = self.frame.size.width * 0.5;
        CGFloat viewH = self.frame.size.height * 0.5;
        //蓝色大圆,画圆我一般喜欢画一条360度的弧线,这样是通过设置圆心位置来决定圆的位置。直接采用画圆的方法是根据左上角的顶点来设定位置;
        CGContextAddArc(ctx, viewW, viewH, 150, 0, M_PI * 2, 0);
        //设置圆的填充色,我根据取色器的数据设置的
        [[UIColor colorWithRed:15 / 255.0 green:106 / 255.0 blue:169 / 255.0 alpha:1] setFill];
        //使用这个方法渲染,可以渲染出描边。
        CGContextDrawPath(ctx, kCGPathFillStroke);
        //小圆,圆心稍微向下,半径变小
        CGContextAddArc(ctx, viewW, viewH + 30, 115, 0, M_PI * 2, 0);
        [[UIColor whiteColor]setFill];
        CGContextDrawPath(ctx, kCGPathFillStroke);

    3、画领带:

        //红色矩形,也可以直接画一条很粗的线段
        CGContextAddRect(ctx, CGRectMake(viewW - 125, viewH + 100, 250, 20));
        [[UIColor redColor]setFill];
        CGContextDrawPath(ctx, kCGPathFillStroke);

    效果;

    4、画眼睛、眼珠。都是由圆形构成,位置设置需要计算一下子;眼睛是对称的,画好一个,把X值对称一下就行了

     //眼睛是椭圆的,采用的是画圆的方式,此时圆的位置由左上角决定;CGRectMake:前两个参数为左上角位置;后两个参数代表圆宽和长,设置不同参数形成椭圆;
        [[UIColor whiteColor]setFill];
        CGContextAddEllipseInRect(ctx, CGRectMake(viewW, viewH - 120, 50, 80));
        CGContextAddEllipseInRect(ctx, CGRectMake(viewW - 50, viewH - 120, 50, 80));
        CGContextDrawPath(ctx, kCGPathFillStroke);
        //眼珠
        [[UIColor blackColor]setFill];
        CGContextAddEllipseInRect(ctx, CGRectMake(viewW + 10, viewH - 70, 20, 20));
        CGContextAddEllipseInRect(ctx, CGRectMake(viewW - 30, viewH - 70, 20, 20));
        CGContextFillPath(ctx);
        //鼻子
        [[UIColor redColor]setFill];
        CGContextAddArc(ctx, viewW, viewH - 38, 12, 0, M_PI * 2, 0);
        CGContextDrawPath(ctx, kCGPathFillStroke);

    这样稍微有点机器猫的样子了;计算位置不用急,算不出来多试几次都能出来;


    5、嘴巴、胡须的绘制;

     //鼻子下面的竖线
        CGContextMoveToPoint(ctx, viewW, viewH - 28);
        CGContextAddLineToPoint(ctx, viewW, viewH + 60);
        CGContextStrokePath(ctx);
        //嘴巴,曲线需要通过贝塞尔曲线绘制,和画线段一样,需要设置一个起点,然后再设置终点和一个控制点来设置弯曲程度;控制点离线段越远弯曲越大;
        CGContextMoveToPoint(ctx, viewW + 95, viewH + 18);
        CGContextAddQuadCurveToPoint(ctx, viewW, viewH + 100, viewW - 95, viewH + 18);
        CGContextStrokePath(ctx);
        //胡须,由线段构成,画好一边的另一边就出来了;
        CGContextMoveToPoint(ctx, viewW + 25, viewH - 20);
        CGContextAddLineToPoint(ctx, viewW + 75, viewH - 30);
        CGContextMoveToPoint(ctx, viewW + 25, viewH - 5);
        CGContextAddLineToPoint(ctx, viewW + 85, viewH - 10);
        CGContextMoveToPoint(ctx, viewW + 25, viewH + 10);
        CGContextAddLineToPoint(ctx, viewW + 75, viewH + 15);
        
        CGContextMoveToPoint(ctx, viewW - 25, viewH - 20);
        CGContextAddLineToPoint(ctx, viewW - 75, viewH - 30);
        CGContextMoveToPoint(ctx, viewW - 25, viewH - 5);
        CGContextAddLineToPoint(ctx, viewW - 85, viewH - 10);
        CGContextMoveToPoint(ctx, viewW - 25, viewH + 10);
        CGContextAddLineToPoint(ctx, viewW - 75, viewH + 15);
        
        CGContextStrokePath(ctx);

    这样机器猫大体形状就出来了

    6、最后一步剪切掉多余的部分,在一开始就设置上绘制范围,这样只有在这个范围的绘图才会显示

         //画裁剪范围,将这段代码放在绘制绘制大圆的前面
        CGContextAddRect(ctx, CGRectMake(viewW - 152, viewH - 152, 304, 272));
        CGContextClip(ctx);

    这样就绘制完成了,然后多谢各位大神指正;

     

  • 相关阅读:
    使用API失效供应商地址Demo(转)
    供应商API补充(详解EBS接口开发之供应商导入)(转)
    供应商地点信息更新(转)
    OAF 小知识
    FNDLOAD移植Lookup Type
    OAF点击事件对页面组件的Required属性不验证
    MFC各种属性定义及DLL使用理解
    mfc制作ActiveX
    QT内置的ICON资源
    [Microsoft][ODBC Microsoft Access Driver] 参数不足,期待是 1
  • 原文地址:https://www.cnblogs.com/xiaoqiuge/p/4841582.html
Copyright © 2020-2023  润新知