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, );
//线条颜色为黑色
[[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, , , M_PI * , );
//设置圆的填充色,我根据取色器的数据设置的
[[UIColor colorWithRed: / 255.0 green: / 255.0 blue: / 255.0 alpha:] setFill];
//使用这个方法渲染,可以渲染出描边。
CGContextDrawPath(ctx, kCGPathFillStroke);
//小圆,圆心稍微向下,半径变小
CGContextAddArc(ctx, viewW, viewH + , , , M_PI * , );
[[UIColor whiteColor]setFill];
CGContextDrawPath(ctx, kCGPathFillStroke);
3、画领带:
//红色矩形,也可以直接画一条很粗的线段
CGContextAddRect(ctx, CGRectMake(viewW - , viewH + , , ));
[[UIColor redColor]setFill];
CGContextDrawPath(ctx, kCGPathFillStroke);
效果;
4、画眼睛、眼珠。都是由圆形构成,位置设置需要计算一下子;眼睛是对称的,画好一个,把X值对称一下就行了
//眼睛是椭圆的,采用的是画圆的方式,此时圆的位置由左上角决定;CGRectMake:前两个参数为左上角位置;后两个参数代表圆宽和长,设置不同参数形成椭圆;
[[UIColor whiteColor]setFill];
CGContextAddEllipseInRect(ctx, CGRectMake(viewW, viewH - , , ));
CGContextAddEllipseInRect(ctx, CGRectMake(viewW - , viewH - , , ));
CGContextDrawPath(ctx, kCGPathFillStroke);
//眼珠
[[UIColor blackColor]setFill];
CGContextAddEllipseInRect(ctx, CGRectMake(viewW + , viewH - , , ));
CGContextAddEllipseInRect(ctx, CGRectMake(viewW - , viewH - , , ));
CGContextFillPath(ctx);
//鼻子
[[UIColor redColor]setFill];
CGContextAddArc(ctx, viewW, viewH - , , , M_PI * , );
CGContextDrawPath(ctx, kCGPathFillStroke);
这样稍微有点机器猫的样子了;计算位置不用急,算不出来多试几次都能出来;
5、嘴巴、胡须的绘制;
//鼻子下面的竖线
CGContextMoveToPoint(ctx, viewW, viewH - );
CGContextAddLineToPoint(ctx, viewW, viewH + );
CGContextStrokePath(ctx);
//嘴巴,曲线需要通过贝塞尔曲线绘制,和画线段一样,需要设置一个起点,然后再设置终点和一个控制点来设置弯曲程度;控制点离线段越远弯曲越大;
CGContextMoveToPoint(ctx, viewW + , viewH + );
CGContextAddQuadCurveToPoint(ctx, viewW, viewH + , viewW - , viewH + );
CGContextStrokePath(ctx);
//胡须,由线段构成,画好一边的另一边就出来了;
CGContextMoveToPoint(ctx, viewW + , viewH - );
CGContextAddLineToPoint(ctx, viewW + , viewH - );
CGContextMoveToPoint(ctx, viewW + , viewH - );
CGContextAddLineToPoint(ctx, viewW + , viewH - );
CGContextMoveToPoint(ctx, viewW + , viewH + );
CGContextAddLineToPoint(ctx, viewW + , viewH + ); CGContextMoveToPoint(ctx, viewW - , viewH - );
CGContextAddLineToPoint(ctx, viewW - , viewH - );
CGContextMoveToPoint(ctx, viewW - , viewH - );
CGContextAddLineToPoint(ctx, viewW - , viewH - );
CGContextMoveToPoint(ctx, viewW - , viewH + );
CGContextAddLineToPoint(ctx, viewW - , viewH + ); CGContextStrokePath(ctx);
这样机器猫大体形状就出来了
6、最后一步剪切掉多余的部分,在一开始就设置上绘制范围,这样只有在这个范围的绘图才会显示
//画裁剪范围,将这段代码放在绘制绘制大圆的前面
CGContextAddRect(ctx, CGRectMake(viewW - , viewH - , , ));
CGContextClip(ctx);

这样就绘制完成了,然后多谢各位大神指正;
Quartz2D之绘制一个简单的机器猫的更多相关文章
- opengl学习笔记(五):组合变换,绘制一个简单的太阳系
创建太阳系模型 描述的程序绘制一个简单的太阳系,其中有一颗行星和一颗太阳,用同一个函数绘制.需要使用glRotate*()函数让这颗行星绕太阳旋转,并且绕自身的轴旋转.还需要使用glTranslate ...
- svg绘制一个简单地饼图
一个简单地svg绘制饼图的demo,代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...
- 如何使用openscad绘制一个简单的键帽.
1 新建空项目 2测数据 测量得出数据.这个长方体的长宽高分别是1.6.4.6.8 注意,这三个数据并不是测量得到的数据,而且加了一点公差值(为3D打印做准备) 3画图 写代码 导入模型 为了方便以后 ...
- Unity3D学习笔记2——绘制一个带纹理的面
目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...
- VC6下OpenGL 开发环境的构建外加一个简单的二维网络棋盘绘制示例
一.安装GLUT 工具包 GLUT 不是OpenGL 所必须的,但它会给我们的学习带来一定的方便,推荐安装. Windows 环境下的GLUT 本地下载地址:glut-install.zip(大小约为 ...
- iOS:quartz2D绘图(画一些简单的图形,如直线、三角形、圆、矩形、文字等)
前一篇几乎已经详细介绍了Quartz2D的所有知识,这一篇以及后面就不废话了,主要是用具体的实例来演示绘图效果. 这里我们先来绘制一些简单的图形(如直线.三角形.圆.矩形.文字.图像),它有两种方式可 ...
- 如何开发一个简单的HTML5 Canvas 小游戏
原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...
- 使用canvas绘制一个时钟
周末学习canvas的一些基础功能,顺带写了一个基础的时钟.现在加工一下,做的更好看一点,先放上效果图: 谈一些自己的理解: (1).要绘制一个新的样式(不想被其他样式影响,或者影响到其他样式),那么 ...
- iOS----自定义UIView,绘制一个UIView
绘制一个UIVIew最灵活的方式就是由它自己完成绘制.实际上你不是绘制一个UIView,你只是子类化了UIView并赋予子类绘制自己的能力.当一个UIVIew需要执行绘图操作的时,drawRect:方 ...
随机推荐
- My97DatePicker的使用
一. 简介 1. 简介 目前的版本是:4.8 2. 注意事项 My97DatePicker目录是一个整体,不可破坏里面的目录结构,也不可对里面的文件改名,可以改目录名 My97DatePicker.h ...
- SQL简单语法
(1)select SELECT 列名称 FROM 表名称 (2)distinct SELECT DISTINCT 列名称 FROM 表名称 SELECT * FROM 表名称 (3)where SE ...
- Android Fragment (二) 实例1
千呼万唤始出来,今天就也写一篇Frament 的简单实例.先看效果: 一看这效果,首先我们的配置资源文件:new -->android xml -->selector --> 四个图 ...
- lightoj1348
//Accepted 6004 KB 924 ms /* source: lightoj1348 time :2015.5.29 by :songt */ /*题解: 树链剖分 */ #include ...
- beego 框架入门
根据官网向导安装配置好环境和工具https://beego.me 就可以开始了,先来入门下. 1.新建项目 在项目目录下 bee new quickstart成功后就可以运行了 http serve ...
- (转)整体把握jQuery -jQuery 的原型关系图
整体把握jQuery -jQuery 的原型关系图 (原)http://www.html5cn.org/article-6529-1.html 2014-7-2 17:12| 发布者: html5cn ...
- KBEngine 学习笔记
最近开始学习 KBE 扩展技能点>_<!所以建一个随笔记录一下遇到的小问题: 问题1 :DBMgr找不到LibMysql32.dll 解决:VS 中KBE源码 默认的是Win32 ,Win ...
- Android Studio 个人常用设置
1.主题 Darcula主题真的看起来舒服很多呢: 2.常用快捷键 "Toggle Case" "Quick Documentation" "Refo ...
- system_call中断处理过程分析
本文所有的分析内容都是基于Linux3.18.6内核,鉴于对应不同内核版本,系统调用的实现不相同.若需要分析其他版本内核的系统调用的实现过程,请谨慎参考. system_call函数的功能是用来响应外 ...
- Java中获取键盘输入值的三种方法
Java中获取键盘输入值的三种方法 Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...