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:方 ...
随机推荐
- 对ToString("X2 ")的理解
/// <summary> /// 将byte型转换为字符串 /// </summary> /// <param name=&q ...
- 工厂方法模式与IoC/DI
IoC——Inversion of Control 控制反转 DI——Dependency Injection 依赖注入 1:如何理解IoC/DI 要想理解上面两个概念,就必须搞清 ...
- Cocoapods的安装
1.先升级Gem sudo gem update --system 2.切换cocoapods的数据源 [先删除,再添加,查看] gem sources --remove https://rubyge ...
- JS总结 循环 退出循环 函数
while循环 while(条件){条件成立就执行的代码} *一般条件变量需要递增,否则会进入死循环(无限循环),浏览器会崩溃甚至电脑死机 例如,逐行输出1-100的数字 var i = 1; whi ...
- 【Excel】宏之初认识
出于提高效率的原因,希望excel能够不需要人为干预的完成一些操作,学习excel宏的编写与调试: 第一列输入公式,第二类输出计算结果:(如果自动获取文件的行数,待补充) Sub Calc() a = ...
- AJAX请求WebService
1.WebService代码 [WebMethod] [ScriptMethod(UseHttpGet = false)] public string GetObject() { User user ...
- 数据库Mysql学习笔记(一)
Mysql 数据库是数据库初学者最佳的选择的,其语法简单,采用的非底层的SQL语言定义(DDL).操作(DML).控制(DCL)数据库. 入门知识:服务器.库.表. (1)安装Mysql服务器.配置文 ...
- 自增序号,而且默认变量就是$i,也就是说在你的volist标签之内,可以直接使用$i
<volist name="vlist" id="v"> <{$i}> // 直接使用$i </volist>
- 安装mongodb 远程服务器报错
安装的时候百度了各种教程 就是装不上 结果原因看下图吧 后面这神秘代码是什么鬼 加上后就能正常下载了
- MyEclipse 10.7.1 最新版官网下载地址
MyEclipse 10.7.1(Windows): http://downloads.myeclipseide.com/downloads/products/eworkbench/indigo/in ...