Quartz2D常见图形的绘制:线条、多边形、圆

UI高级
Quartz2D

http://ios.itcast.cn  iOS学院

掌握

drawRect:方法的使用

常见图形的绘制:线条、多边形、圆

绘图状态的设置:文字颜色、线宽等

图形上下文状态的保存与恢复(图形上下文栈)

图片裁剪

截图

什么是Quartz2D

Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统

Quartz 2D能完成的工作

Ø绘制图形 : 线条\三角形\矩形\圆\弧等

Ø绘制文字

Ø绘制\生成图片(图像)

Ø读取\生成PDF

Ø截图\裁剪图片

Ø自定义UI控件

Ø… …

Quartz2D实例

Quartz 2D能做很多强大的事情,例如

Ø裁剪图片

Quartz2D实例

Ø涂鸦\画板

Quartz2D实例

Ø手势解锁

Ø

Quartz2D实例

Ø报表:折线图\饼状图\柱状图

Ø

Quartz2D在iOS开发中的价值

为了便于搭建美观的UI界面,iOS提供了UIKit框架,里面有各种各样的UI控件

ØUILabel:显示文字

ØUIImageView:显示图片

ØUIButton:同时显示图片和文字(能点击)

Ø… …

Ø

利用UIKit框架提供的控件,拼拼凑凑,能搭建和现实一些简单、常见的UI界面

但是,有些UI界面极其复杂、而且比较个性化,用普通的UI控件无法实现,这时可以利用Quartz2D技术将控件内部的结构画出来,自定义控件的样子

其实,iOS中大部分控件的内容都是通过Quartz2D画出来的

因此,Quartz2D在iOS开发中很重要的一个价值是:自定义view(自定义UI控件)

图形上下文

图形上下文(Graphics Context):是一个CGContextRef类型的数据

图形上下文的作用

Ø保存绘图信息、绘图状态

Ø决定绘制的输出目标(绘制到什么地方去?)

(输出目标可以是PDF文件、Bitmap或者显示器的窗口上)

相同的一套绘图序列,指定不同的Graphics Context,就可将相同的图像绘制到不同的目标上

图形上下文

Quartz2D提供了以下几种类型的Graphics Context:

ØBitmap
Graphics Context

ØPDF
Graphics Context

ØWindow
Graphics Context

ØLayer
Graphics Context

ØPrinter
Graphics Context

自定义view

如何利用Quartz2D自定义view?(自定义UI控件)

如何利用Quartz2D绘制东西到view上?

Ø首先,得有图形上下文,因为它能保存绘图信息,并且决定着绘制到什么地方去

Ø其次,那个图形上下文必须跟view相关联,才能将内容绘制到view上面

Ø

自定义view的步骤

Ø新建一个类,继承自UIView

Ø实现- (void)drawRect:(CGRect)rect方法,然后在这个方法中

u取得跟当前view相关联的图形上下文

u绘制相应的图形内容

u利用图形上下文将绘制的所有内容渲染显示到view上面

drawRect:

为什么要实现drawRect:方法才能绘图到view上?

Ø因为在drawRect:方法中才能取得跟view相关联的图形上下文

Ø

drawRect:方法在什么时候被调用?

Ø当view第一次显示到屏幕上时(被加到UIWindow上显示出来)

Ø调用view的setNeedsDisplay或者setNeedsDisplayInRect:时

绘图顺序

Quartz2D须知

Quartz2D的API是纯C语言的

Quartz2D的API来自于Core
Graphics框架

数据类型和函数基本都以CG作为前缀

ØCGContextRef

ØCGPathRef

ØCGContextStrokePath(ctx);

Ø……

drawRect:中取得的上下文

在drawRect:方法中取得上下文后,就可以绘制东西到view上

View内部有个layer(图层)属性,drawRect:方法中取得的是一个Layer Graphics Context,因此,绘制的东西其实是绘制到view的layer上去了

View之所以能显示东西,完全是因为它内部的layer

Quartz2D绘图的代码步骤

1.获得图形上下文

CGContextRef ctx
= UIGraphicsGetCurrentContext();

2.拼接路径(下面代码是搞一条线段)

CGContextMoveToPoint(ctx,
10, 10);

CGContextAddLineToPoint(ctx,
100, 100);

3.绘制路径

CGContextStrokePath(ctx); //
CGContextFillPath(ctx);

常用拼接路径函数

新建一个起点

void CGContextMoveToPoint(CGContextRef c, CGFloat x, CGFloat y)

添加新的线段到某个点

void CGContextAddLineToPoint(CGContextRef c, CGFloat x, CGFloat y)

添加一个矩形

void CGContextAddRect(CGContextRef c, CGRect rect)

添加一个椭圆

void CGContextAddEllipseInRect(CGContextRef context, CGRect rect)

添加一个圆弧

void CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y,

CGFloat radius, CGFloat startAngle, CGFloat endAngle, int
clockwise)

常用绘制路径函数

Mode参数决定绘制的模式

void CGContextDrawPath(CGContextRef c, CGPathDrawingMode mode)

绘制空心路径

void CGContextStrokePath(CGContextRef c)

绘制实心路径

void CGContextFillPath(CGContextRef c)

提示:一般以CGContextDraw、CGContextStroke、CGContextFill开头的函数,都是用来绘制路径的

图形上下文栈的操作

将当前的上下文copy一份,保存到栈顶(那个栈叫做”图形上下文栈”)

void CGContextSaveGState(CGContextRef c)

将栈顶的上下文出栈,替换掉当前的上下文

void CGContextRestoreGState(CGContextRef c)

矩阵操作

利用矩阵操作,能让绘制到上下文中的所有路径一起发生变化

Ø缩放

void CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)

Ø旋转

void CGContextRotateCTM(CGContextRef c, CGFloat
angle)

Ø

Ø平移

void CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty)

Quartz2D的内存管理

使用含有“Create”或“Copy”的函数创建的对象,使用完后必须释放,否则将导致内存泄露

使用不含有“Create”或“Copy”的函数获取的对象,则不需要释放

如果retain了一个对象,不再使用时,需要将其release掉

可以使用Quartz 2D的函数来指定retain和release一个对象。例如,如果创建了一个CGColorSpace对象,则使用函数CGColorSpaceRetain和CGColorSpaceRelease来retain和release对象。

也可以使用Core
Foundation的CFRetain和CFRelease。注意不能传递NULL值给这些函数

图片水印

水印:在图片上加的防止他人盗图的半透明logo、文字、图标

水印的作用

Ø告诉你这个图片从哪来的

Ø主要是一些网站为了版权问题、广告而添加的

图片水印

有时候,在手机客户端app中也需要用到水印技术

比如,用户拍完照片后,可以在照片上打个水印,标识这个图片是属于哪个用户的

实现方式:利用Quartz2D,将水印(文字、LOGO)画到图片的右下角

核心代码

Ø开启一个基于位图的图形上下文

void     UIGraphicsBeginImageContextWithOptions(CGSize
size, BOOL
opaque, CGFloat
scale)

Ø从上下文中取得图片(UIImage)

UIImage* UIGraphicsGetImageFromCurrentImageContext();

Ø结束基于位图的图形上下文

void     UIGraphicsEndImageContext();

图片裁剪

很多app的头像,都是圆形的

图片裁剪

这时需要把一张普通的图片刻意裁剪成圆形

核心代码

void CGContextClip(CGContextRef c)

将当前上下所绘制的路径裁剪出来(超出这个裁剪区域的都不能显示)

屏幕截图

有时候需要截取屏幕上的某一块内容,比如捕鱼达人游戏

Q & A

人生就像卫生纸,没事的时候,尽量少扯; 时间就像卫生纸,看着挺多,用着用着就没了...

Jonathan_Lee

时间: 2024-12-28 11:39:10

Quartz2D常见图形的绘制:线条、多边形、圆的相关文章

HTML5中的<canvas>画布:使用canvas元素在网页上绘制线条和圆(1)

什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以及添加图像的方法. 创建 Canvas 元素 向 HTML5 页面添加 canvas 元素. 规定元素的 id.宽度和高度: 1 <canvas id="myCanvas" width="200" height="100"></ca

iOS边练边学--(Quartz2D)基本图形的绘制#附加自定义进度控件的练习

一.Quartz2D使用须知 Quartz2D的API是纯C语言的 Quartz2D的API来自于Core Graphics框架 二.<1>通过原始的方法(C语言)绘制简单图形--了解 <2>OC也封装了绘制图形的框架UIKit(贝瑟尔路径)--掌握 三.自定义进度控件的练习,效果图

HTML5 Canvas 学习笔记(canvas绘制线条、矩形、多边形、圆形、圆环、组合图形、文字、自定义图像)

学习资源:http://www.w3school.com.cn/html5/html_5_canvas.asp   http://blog.csdn.net/clh604/article/details/8536059   http://www.jb51.net/html5/70307.html 一.对 canvas 的理解 <canvas>标签是 HTML5 中的新标签,像所有的 dom 对象一样它有自己本身的属性.方法和事件. canvas 是用来在网页上绘制图形的(我们通常称之为画布),

常用GDI函数(1):绘制线条和图形

1. CDC::SetPixel()用来绘制一个像素点. 使用Win32 API函数: HDC hdc = ::GetDC(m_hWnd);//获得窗口的设备描述表 ::SetPixel(hdc, 100, 200, RGB(255, 0, 0)); ::ReleaseDC(m_hWnd, hdc);//释放DC资源 CDC::MoveTo(),CDC::LineTo()用来绘制直线. 使用CDC类: CDC* pDC = GetDC();//获得与当前窗口相关联的DC对象 pDC->MoveT

canvas绘制直线多边形(二)

在绘制之前,依据上一节所说的内容获取context  2维画布 1 context.moveTo(x,y); 定义绘图开始 2 context.lintTo(x1,y1); 定义线条画到的位置 3 context.lineWidth=5; //线条宽度 4 context.strokeStyle="red" //线条颜色 5 context.stroke(); //用于绘制线条 利用上述代码我们可以绘制一条,从(x,y)坐标开始,到(x1,y1)结束的宽5个像素,颜色为红色的直线  

HTML5 &lt;canvas&gt; 元素用于图形的绘制,通过脚本(通常是javascript)完成

<canvas> 标签只是图形容器,您必须使用脚本来绘制图形 可以通过多种方法使用canvas绘制路径\盒\圆以及添加图像 创建一个画布(Canvas) 一个画布在网页中是一个矩形框,通过 <canvas> 元素来绘制. 注意: 默认情况下 <canvas> 元素没有边框和内容. <canvas>简单实例如下: <canvas id="myCanvas" width="200" height="100&

iOS Quartz2D 渐变图形 CGGradient CGShading

最近在学习iOS Quartz2D二维图形绘制--->渐变效果 Quartz2D 渐变 Quartz提供了两个不透明数据odgago创建渐变: CGShadingRef 和 CGGradientRef 可以使用任何一种来创建轴向(axial)或径向(radial)渐变.一个渐变是从一个颜色到另一个颜色的填充 一个轴向渐变(也成为线性渐变) 不说废话直接上干货, 代码和注释还算全,不懂的自行百度吧 <span style="font-size:18px;">// Qua

零基础HTML5游戏制作教程 第2章 简单图形的绘制

第二章 简单图形的绘制 HTML5支持使用Canvas和SVG等方式在网页直接绘制图形.其中SVG适合用来绘制高质量的矢量图形,不适合用来做游戏,所以我们做游戏一般使用Canvas. 由于本教程以简单为原则,所以在初学阶段请不要把注意力分散到美工.画质等细节,我们只需要掌握矩形.多边形.圆形等简单图形的绘制,并对这些图形编程,使之具有一定的运动能力和游戏效果. (如果你偷懒,你甚至可以跳过本章中多边形和圆形的绘制,只学矩形,然后直接去看下一章.) 一,矩形的绘制 命令的格式是context.fi

css写的常见图形

一直都没有为css的分类写点东西,今天找了一些资料来写一写这个css的常见图形,开发中会用到的哦! 从最简单的正方形说: width: 100px; height: 100px; background: red; 长方形: width: 200px; height: 100px; background: red; 圆: width: 100px; height: 100px; background: red; -moz-border-radius: 50px; -webkit-border-ra