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:方 ...
随机推荐
- ubuntu更新源(Package has no installation candidate 的问题)
最近将公司的台式机安装了ubuntu16.04,安装之后,使用apt-get install openssh-server 发现出现:Package 'openssh-server' has no i ...
- 一步一步搭框架(asp.netmvc+easyui+sqlserver)-01
一步一步搭框架(asp.netmvc+easyui+sqlserver)-01 要搭建的框架是企业级开发框架,适用用企业管理信息系统的开发,如:OA.HR等 1.框架名称:sampleFrame. 2 ...
- mybatis学习
什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...
- STL库中的正态分布函数
在设计抽奖一类程序中,有时会需要一种概率“有较大可能获得一个普通结果,有较小可能获得一个糟糕或极好的结果”,这就可以用正态分布函数来获得这样一个结果. STL中已经提供了一系列随机分布的函数,包括正态 ...
- 【Python】一、除法问题及基本操作(逻辑与,if替代switch)及支持中文打印
1.查看版本 C:\Users\XXX>python -V Python 2.7.1 2.除法问题(不要整除) from __future__ import division tmp=0x3ec ...
- vs2012 检测到有潜在危险的 Request.Form 值
今天用vs2012写网站,其中要用到网页编辑器,调试时提示:检测到有潜在危险的 Request.Form 值随即上网搜索: 解决方法一:具体页面添加 ValidateRequest="fal ...
- 哈希(Hash)与加密(Encrypt)相关内容
1.哈希(Hash)与加密(Encrypt)的区别 哈希(Hash)是将目标文本转换成具有相同长度的.不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的.可 ...
- "****" is not translated in zh, zh_CN.的解决方法
最近在开发一个app,要用到静默安装等一些小技术,但是引发了问题如下: 在Android SDK Tool r19之后, Export的时候遇到xxx is not translated in yyy ...
- 使用WP8最新的AudioVideoCaptureDevice类制作录像应用
WP8出来好一段时间了,新出的AudioVideoCaptureDevice类自定义功能比WP7的CaptureSource强大的多,但网上比较全面的中文实例还比较少,分享一个最近做的小实例给大家参考 ...
- Android倒计时:计算两个时间将得到的时间差转化为倒计时(xx时xx分xx秒格式)
首先是一个自定义控件: public class RushBuyCountDownTimerView extends LinearLayout { // 小时,十位 private TextView ...