第一步:

先创建一个OneView类,并在storyboard里边拖拽一个UIview,将这个UIview的类改成OneView。如图所示:

第二步:

在新创建的Oneview里,补齐下列代码:

 //
// OneView.m
// 03-drawImage
//
// Created by jerry on 15/7/20.
// Copyright (c) 2015年 jerry. All rights reserved.
// #import "OneView.h" @implementation OneView -(void)drawRect:(CGRect)rect
{
// [self drawImage];
[self drawYellowPop:rect];
}
//
-(void)drawYellowPop:(CGRect)rect
{
// 先获取图片上下文对象
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 设置头及颜色
[self setHeaderWithCGContextRef:ctx andRect:rect]; [self setMouthWith:ctx andRect:rect]; [self setGlassesWith:ctx andRect:rect]; [self setHairWith:ctx andRect:rect]; }
/**
* 画嘴
*
* @param ctx <#ctx description#>
* @param rect <#rect description#>
*/
-(void)setMouthWith:(CGContextRef)ctx andRect:(CGRect)rect
{
// 设置中间点
CGFloat CenterX = rect.size.width * 0.5;
CGFloat CenterY = rect.size.width * 0.5; // 设置当前点
CGFloat marginX = ;
CGFloat marginY = ;
CGFloat currenX = CenterX - marginX;
CGFloat currenY = CenterY - marginY;
CGContextMoveToPoint(ctx, currenX, currenY); // 结束点
CGFloat endX = CenterX + marginX;
CGFloat endY = currenY;
// 贝塞尔曲线
CGContextAddQuadCurveToPoint(ctx, CenterX, CenterY, endX, endY); // 设置颜色
[[UIColor blackColor]set];
// 渲染
CGContextStrokePath(ctx);
}
// 设置眼镜
-(void)setGlassesWith:(CGContextRef)ctx andRect:(CGRect)rect
{
CGFloat LineX = rect.size.width * 0.5 - ; // 减半径
CGFloat LineY = ;
// 画一条黑线
CGContextMoveToPoint(ctx,LineX , LineY);
// 结束点
CGFloat EndLineX = LineX + * ;
CGFloat EndLineY = LineY;
CGContextAddLineToPoint(ctx,EndLineX, EndLineY);
CGContextSetLineWidth(ctx, );
[[UIColor blackColor]set];
CGContextStrokePath(ctx); // 2.画眼
// 注释:画眼就是画圆
CGFloat leftEyesY = LineY;
CGFloat leftEyesRadius = ;
CGFloat leftEyesX = rect.size.width *0.5 - leftEyesRadius;
CGFloat leftEyesStartAngle = ;
CGFloat leftEyesEndAngle = M_PI * ;
[[UIColor redColor]set];
CGContextAddArc(ctx, leftEyesX, leftEyesY, leftEyesRadius, leftEyesStartAngle, leftEyesEndAngle, );
CGContextFillPath(ctx); CGFloat rightEyesX = leftEyesX + leftEyesRadius * ;
CGFloat rightEyesY = leftEyesY;
CGFloat rightEyesSstartAngle = ;
CGFloat rightEyesRadius = leftEyesRadius;
CGFloat rightEyesEndAngle = leftEyesEndAngle;
CGContextAddArc(ctx, rightEyesX, rightEyesY, rightEyesRadius, rightEyesSstartAngle, rightEyesEndAngle, );
[[UIColor redColor]set];
CGContextFillPath(ctx); // 镜片
CGFloat leftGlassesRadius = ;
CGFloat leftGlassesX = leftEyesX;
CGFloat leftGlassesY = LineY;
CGContextAddArc(ctx, leftGlassesX, leftGlassesY, leftGlassesRadius, , M_PI * , ); CGFloat rightGlassesRadius = leftGlassesRadius;
CGFloat rightGlassesX = rightEyesX;
CGFloat rightGlassesY = LineY;
CGContextAddArc(ctx, rightGlassesX, rightGlassesY, rightGlassesRadius,, M_PI * , );
[[UIColor whiteColor]set];
CGContextFillPath(ctx); // 眼睛珠
CGFloat leftZhuRadius = ;
CGFloat leftZhuY = LineY;
CGFloat leftZhuX = leftGlassesX +;
CGContextAddArc(ctx, leftZhuX, leftZhuY, leftZhuRadius, , M_PI * , ); CGFloat rightZhuRadius = leftZhuRadius;
CGFloat rightZhuY = LineY;
CGFloat rightZhuX = rightGlassesX - ;
CGContextAddArc(ctx, rightZhuX, rightZhuY, rightZhuRadius, , M_PI * , ); [[UIColor colorWithRed:/255.0 green:/255.0 blue:/255.0 alpha:]set];
CGContextFillPath(ctx); // 左瞳孔
CGFloat leftTongRadius = ;
CGFloat leftTongY = leftZhuY;
CGFloat leftTontX = leftZhuX;
CGContextAddArc(ctx, leftTontX, leftTongY, leftTongRadius, , M_PI * , ); // 右瞳孔
CGFloat rightTongRadius = leftTongRadius;
CGFloat rightTongX = rightZhuX;
CGFloat rightTongY = rightZhuY;
CGContextAddArc(ctx, rightTongX, rightTongY, rightTongRadius, , M_PI *, );
[[UIColor colorWithRed:/255.0 green:/255.0 blue:/255.0 alpha:]set];
CGContextFillPath(ctx); // 左聚光
CGFloat leftJuRadius = ;
CGFloat leftJuX = leftTontX - ;
CGFloat leftJuY =leftTongY - ;
CGContextAddArc(ctx, leftJuX, leftJuY, leftJuRadius, , M_PI * , ); // 右聚光
CGFloat rightJuRadius = leftJuRadius;
CGFloat rightJuX = rightTongX - ;
CGFloat rightJuY = rightTongY - ;
CGContextAddArc(ctx, rightJuX, rightJuY, rightJuRadius, , M_PI *, );
[[UIColor whiteColor]set];
CGContextFillPath(ctx);
} -(void)setHeaderWithCGContextRef:(CGContextRef)ctx andRect:(CGRect)rect
{
// 画图片
CGFloat topX = rect.size.width * 0.5; // 确定x 轴的点
CGFloat topY = ;
CGFloat topRadius = ; // 半径
CGFloat topStartAngle = ; // 起点
CGFloat topEndAngle = M_PI;
// 0 是顺时针 1 是逆时针
CGContextAddArc(ctx, topX, topY, topRadius, topStartAngle, topEndAngle, );
// 以上一个终点为起点画直线
CGFloat leftLineX = topX - topRadius;
CGFloat leftLineY = topY + ;
CGContextAddLineToPoint(ctx, leftLineX, leftLineY); CGFloat downX = topX;
CGFloat downY = leftLineY;
CGContextAddArc(ctx, downX, downY, topRadius,topEndAngle , topStartAngle, );
// 关闭路径
CGContextClosePath(ctx);
// 填充背景颜色
[[UIColor yellowColor]set];
//显示在view
CGContextFillPath(ctx);
}
/**
* 设置头发
*
*/
- (void)setHairWith:(CGContextRef)ctx andRect:(CGRect)rect
{
// 第一根头发
CGFloat hairStartX = rect.size.width *0.5;
CGFloat hairStartY = ;
CGContextMoveToPoint(ctx, hairStartX, hairStartY);
CGFloat hairEndX = rect.size.width * 0.5 + ;
CGFloat hairEndY = ;
CGContextAddLineToPoint(ctx, hairEndX, hairEndY); // 第二根头发
CGFloat hairTwoStartX = rect.size.width * 0.5 + ;
CGFloat hairTwoStartY = ;
CGContextMoveToPoint(ctx, hairTwoStartX, hairTwoStartY);
CGFloat hairTowEndX = rect.size.width * 0.5 + ;
CGFloat hairTowEndY = ;
CGContextAddLineToPoint(ctx, hairTowEndX, hairTowEndY); // 第三根头发
CGFloat hairThreeStartX = rect.size.width * 0.5 - ;
CGFloat hairThreeStartY = ;
CGContextMoveToPoint(ctx, hairThreeStartX, hairThreeStartY);
CGFloat hairThreeEndX = rect.size.width * 0.5 - ;
CGFloat hairThreeEndY = ;
CGContextAddLineToPoint(ctx, hairThreeEndX, hairThreeEndY); // 第四个头发
CGFloat hairFourStartX = rect.size.width * 0.5 - ;
CGFloat hairFourStartY = ;
CGContextMoveToPoint(ctx, hairFourStartX, hairFourStartY);
CGFloat hairFourEndX = rect.size.width *0.5 - ;
CGFloat hairFourEndY = ;
CGContextAddLineToPoint(ctx, hairFourEndX, hairFourEndY); // 第五根头发
CGFloat hairFiveStartX = rect.size.width * 0.5 + ;
CGFloat hairFiveStartY = ;
CGContextMoveToPoint(ctx, hairFiveStartX, hairFiveStartY);
CGFloat hairFiveEndX = rect.size.width * 0.5 + ;
CGFloat hairFiveEndY = ;
CGContextAddLineToPoint(ctx, hairFiveEndX, hairFiveEndY); [[UIColor blackColor]set];
CGContextSetLineWidth(ctx, );
CGContextStrokePath(ctx); }
/**
* 画图片
*/
-(void)drawImage
{
// 用oc代码 可以不用获取图形上下文对象
UIImage *img = [UIImage imageNamed:@""];
[img drawAsPatternInRect:CGRectMake(, , , )]; }
@end

最后运行显示的结果如下:

用Quartz 2D画小黄人的更多相关文章

  1. 纯CSS3画出小黄人并实现动画效果

    前言 前两天我刚发布了一篇CSS3实现小黄人动画的博客,但是实现的CSS3动画是基于我在站酷网找到的一张小黄人的jpg格式图片,并自己用PS抠出需要实现动画的部分,最后才完成的动画效果.但是,其实我的 ...

  2. css3实现小黄人

    效果就像这样: 不废话,直接上代码! hrml代码: <!DOCTYPE html> <html> <head lang="zh"> <m ...

  3. [置顶] 几行代码实现ofo首页小黄人眼睛加速感应转动

    最新版的ofo 小黄车的首页小黄人眼睛随重力而转动,感觉有点炫酷,学习一下吧,以下代码是在xamarin android下实现 ofo首页效果图: xamarin android实现效果: 实现思路: ...

  4. Python turtle模块小黄人程序

    讲解Python初级课程的turtle模块,简单粗暴的编写了小黄人的程序.程序还需要进一步优化.难点就是要搞清楚turtle在绘制图形过程中的方向变化. import turtle t = turtl ...

  5. 小黄人IP营销的四种玩法思维导图

    小黄人IP营销的四种玩法思维导图 ------------------------------ 本人微信公众帐号: 心禅道(xinchandao) 本人微信公众帐号:双色球预测合买(ssqyuce)

  6. CSS3实现小黄人动画

    转载请注明出处,谢谢! 每次看到CSS3动画就心痒痒想试一下,记得一个多月前看了白树哥哥的一篇博客,突然开窍,于是拿他提供的demo试了一下,感觉很棒!下图为demo提供的动画帧设计稿. 自己也想说搞 ...

  7. 静态分析第三发 so文件分析(小黄人快跑)

    本文作者:i春秋作家——HAI_ 0×00 工具 1.IDA pro 2.Android Killer 0×01 环境 小黄人快跑 下载地址http://download.csdn.net/downl ...

  8. CSS3小黄人

    CSS3实现小黄人 效果图: 代码如下,复制即可使用: <!DOCTYPE HTML> <HTML> <head> <title>CSS3实现小黄人&l ...

  9. 音频算法之小黄人变声 附完整C代码

    前面提及到<大话音频变声原理 附简单示例代码>与<声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码> 都稍微讲过变声的原理和具体实现. 大家都知道,算法 ...

随机推荐

  1. ansible创建vmware虚拟机

    环境:vmware 虚拟化需求:如果业务部门一次提几十台甚至几百台虚拟机需求,一个个的手动创建肯定耗时 使用ansible vmware_guest 创建虚拟机,避免手动一台一台创建的纯手工 工作废话 ...

  2. Dining POJ - 3281

    题意: f个食物,d杯饮料,每个牛都有想吃的食物和想喝的饮料,但食物和饮料每个只有一份 求最多能满足多少头牛.... 解析: 一道简单的无源汇拆点最大流   无源汇的一个最大流,先建立超级源s和超级汇 ...

  3. startSSL 申请免费的SSL证书

    打开网址https://www.startssl.com/?app=12,选择Sign-up注册. 输入个人注册信息 需注意以下几点:(1)地址必须详细,否则你会收到这样的邮件: Please pro ...

  4. 13 Zabbix Item类型之Zabbix ODBC类型

    点击返回:自学Zabbix之路 13 Zabbix Item类型之Zabbix ODBC类型 ODBC是C语言开发的.用于访问数据库的中间件接口 . zabbix支持查询任何ODBC支持的数据库.za ...

  5. 【bzoj3938】 Robot

    http://www.lydsy.com/JudgeOnline/problem.php?id=3938 (题目链接) 题意 给出数轴上$n$个点,有$m$个操作,在时间$t$让一个点以一定的速度移动 ...

  6. 【codeforces contest 1119 F】Niyaz and Small Degrees

    题目 描述 \(n\) 个点的树,每条边有一个边权: 对于一个 \(X\) ,求删去一些边后使得每个点的度数 \(d_i\) 均不超过 \(X\) 的最小代价: 你需要依次输出 \(X=0 \to n ...

  7. CrossFire Round #481 div.3 978 打后感

    虚拟赛,头一次打div.3感觉好TM水啊...... 一共7道题,我A了6道,第7题有思路但是没时间了. 结果还是排在700多名,可能其他人也觉得太水了吧. 逐一解析题目: A好简单,因为不想离散化我 ...

  8. 【洛谷P1638】逛画展

    题目大意:给定 N 个数字组成的序列,求刚好拥有所有 M 种数字的最短区间. 题解:双指针算法是一种对于暴力的优化算法,对于这道题来说,一个显然的暴力是:对于序列中每一个位置 pos,计算出这个位置右 ...

  9. 跟我一起学习vue2(学习工程目录)[三]

    查看生成的my-project的工程目录 首先看 build是最终发布的代码存放位置. 我查看了一下目录,里面都是Js文件 config目录里面主要是配置目录,包括端口号.如果开的项目多,可以进入in ...

  10. k8s 常用命令汇集

    通过yaml文件创建: kubectl create -f xxx.yaml (不建议使用,无法更新,必须先delete) kubectl apply -f xxx.yaml (创建+更新,可以重复使 ...