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:方 ...
 
随机推荐
- 如何通过JDBC访问数据库
			
Java数据库连接(JDBC)用与在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口,java.sql包中包含了JDBC操作数据库 ...
 - clip:rect矩形剪裁
			
clip:rect(top right bottom left);依据上-右-下-左的顺序提供自图片左上角为(0,0)坐标计算的四个偏移数值,其中任一数值都可用auto替换. 矩形剪裁 还需要绝对定位 ...
 - Sort Characters By Frequency
			
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
 - 让低版本IE支持css3背景图片缩放属性background-size
			
IE7,8中不支持背景图片的缩放.下面的代码可以帮你实现兼容 background: url(/content/img/yuehuibtn.png);//css3代码 background-size: ...
 - hdu 2066
			
ps:我天...之前看了迪杰斯特拉..现在这题要用到floyd..就是先建一个图,然后从列开始遍历,每列里遍历行,行又对应每列... 从A列开始遍历每行,比如遍历到B,这时候B->A知道是2,接 ...
 - 团队开发——冲刺2.f
			
冲刺阶段二(第六天) 1.昨天做了什么? 编写软件测试计划书第二部分:游戏中新增3个道具(变大.变小.延时). 2.今天准备做什么? 1) 编写软件计划书第三阶段(项目任务.实施计划.风险管理): 2 ...
 - UIKit框架之UITouch
			
1.继承链:NSObject 2.获取触发点的位置 (1)- (CGPoint)locationInView:(UIView *)view :返回指定视图的触发点的位置 (2)- (CGPoint)p ...
 - portotype
			
[ portotype ] [语法] function :function Name是创建新的函数的名称 body : body可以选项,包含调用该函数时被执行的JScrtipt 代码的字符串. ...
 - nexus7 二代 升级 android L
			
折腾了半天 ,最后发现其实很简单... 1.装好windows下gdb和bootloader的驱动,注意打开usb debug,另外进入bootloader是开机按电源键和音量减小键,至于要解锁这个想 ...
 - 查看外网出口IP && Traceroute
			
一.CentOS 查看外网出口IP 1---------------- # curl ifconfig.me 2----------------# curl icanhazip.com 二.Trace ...