第三十四篇:Quartz2D绘图

1.Quartz2D在iOS开发中的价值

?自定义view(自定义UI控件)

2.图形上下文

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

2)图形上下文的作用

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

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

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

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

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

?BitmapGraphics Context

?PDFGraphics
Context

?WindowGraphics
Context

?LayerGraphics
Context

?PrinterGraphics
Context

3.自定义view

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

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

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

2)自定义view的步骤

?新建一个类,继承自UIView

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

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

>绘制相应的图形内容

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

3)

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

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

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

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

?调用view的setNeedsDisplay或者setNeedsDisplayInRect:时

4)drawRect:中取得的上下文

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

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

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

4.Quartz2D绘图的代码步骤

1)获得图形上下文

CGContextRef ctx=
UIGraphicsGetCurrentContext();

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

CGContextMoveToPoint(ctx,10,
10);

CGContextAddLineToPoint(ctx,100,
100);

3)绘制路径

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

5.绘图的一些方法

链接一: https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGContext/index.html#//apple_ref/c/func/CGContextAddArc

链接二:http://donbe.blog.163.com/blog/static/138048021201052093633776/

获得图形上下文:

UIGraphicsGetCurrentContext()

Paths

指定一个点成为current point,Quartz会跟踪current point一般执行完一个相关函数后,current point都会相应的改变.

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

创建一条直线,从current point到 (x,y),然后current point会变成(x,y)

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

创建多条直线,比如points有两个点,那么会画两条直线 从current point到 (x1,y1), 然后是(x1,y1)到(x2,y2),然后current point会变成points中的最后一个点

 void CGContextAddLines (
    CGContextRef c,
    const CGPoint points[],
    size_t count
 );

形成封闭图形

CGContextClosePath(CGContextRef  _Nullable c)

设置线宽状态:

CGContextSetLineWidth(CGContextRef  _Nullable c, CGFloat width);

设置线两端的形状

CGContextSetLineCap(CGContextRef  _Nullable c, CGLineCap cap)

设置填充的颜色

CGContextSetRGBFillColor(CGContextRef  _Nullable c, CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)
CGContextSetRGBStrokeColor(CGContextRef  _Nullable c, CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)

裁剪图形

CGContextClip(CGContextRef  _Nullable c)
CGContextClipToMask(CGContextRef  _Nullable c, CGRect rect, CGImageRef  _Nullable mask)
CGContextClipToRect(CGContextRef  _Nullable c, CGRect rect)
CGContextClipToRects(CGContextRef  _Nullable c, const CGRect * _Nonnull rects, size_t count)

画一个椭圆

CGContextAddEllipseInRect(CGContextRef  _Nullable c, CGRect rect)

画出一个距形

CGContextAddRect(CGContextRef  _Nullable c, CGRect rect)
CGContextAddRects(CGContextRef  _Nullable c, const CGRect * _Nullable rects, size_t count)

弧:Arcs

两种方法创建弧度 第一种

void CGContextAddArc (
    CGContextRef c,
    CGFloat x,             //圆心的x坐标
    CGFloat y,    //圆心的x坐标
    CGFloat radius,   //圆的半径
    CGFloat startAngle,    //开始弧度
    CGFloat endAngle,   //结束弧度
    int clockwise          //0表示顺时针,1表示逆时针
 );

假如想创建一个完整的圆圈,那么 开始弧度就是0 结束弧度是 2pi, 因为圆周长是 2*pi*r.

最后,函数执行完后,current point就被重置为(x,y).

还有一点要注意的是,假如当前path已经存在一个subpath,那么这个函数执行的另外一个效果是

会有一条直线,从current point到弧的起点

第二种

 void CGContextAddArcToPoint (
    CGContextRef c,
    CGFloat x1,  //端点1的x坐标
    CGFloat y1,  //端点1的y坐标
    CGFloat x2,  //端点2的x坐标
    CGFloat y2,  //端点2的y坐标
    CGFloat radius //半径
 );

原理:首先画两条线,这两条线分别是 current point to (x1,y1) 和(x1,y1) to (x2,y2).

这样就是出现一个以(x1,y1)为顶点的两条射线,

然后定义半径长度,这个半径是垂直于两条射线的,这样就能决定一个圆了,更好的理解看下图,不过个人认为下图所标的 tangent point 1的位置是错误的。

最后,函数执行完后,current point就被重置为(x2,y2).

还有一点要注意的是,假如当前path已经存在一个subpath,那么这个函数执行的另外一个效果是

会有一条直线,从current point到(x1,y1)

常用绘制路径函数

//Mode参数决定绘制的模式
void CGContextDrawPath(CGContextRef c, CGPathDrawingMode mode)

//绘制空心路径
void CGContextStrokePath(CGContextRef c)

//绘制实心路径
void CGContextFillPath(CGContextRef c)

绘制好的图形

绘制好的图形

绘制好的图

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 05:04:40

第三十四篇:Quartz2D绘图的相关文章

第三十四篇 Python面向对象之 反射(自省)

什么是反射? 反射的概念是由Smith在1982年提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成就. 四个可以实现自省的函数,是Python的内置函数 下列方法适用于类和对象 先看这四个方法对实例(b1)的使用 # 演示代码 class BlackMedium: feature = 'Ugly' def __init__(self, nam

第三十四篇:在SOUI中使用异步通知

概述 异步通知是客户端开发中常见的需求,比如在一个网络处理线程中要通知UI线程更新等等. 通常在Windows编程中,为了方便,我们一般会向UI线程的窗口句柄Post/Send一个窗口消息从而达到将非UI线程的事件切换到UI线程处理的目的. 在SOUI引入通知中心以前要在SOUI中处理非UI线程事件我也推荐用上面的方法. 使用窗口消息至少有以下两个不足: 1.需要在线程中持有一个窗口句柄. 2.发出的消息只能在该窗口句柄的消息处理函数里处理. SNotifyCenter 最新的SOUI引入了一个

小刘同学的第一百三十四篇日记

坚持果然是最艰难的事. 今天还是更新不了博文,不过也不想勉强自己. 的确被论文所困,老师总是很严格的指出我的问题,并且让我逐一修改. 其实一直以来都很讨厌这样的自己. 什么事情都拖到最后-- 总是提前做完休息活动.娱乐活动-- 最应该,也是最需要做的东西,结果什么都没做-- 这样的自己,真是连自己都看不起呢. 马上就要变成社会人士了. 自己不在校园,更应该把任务和工作提前做好做完. 再考虑娱乐和休息. 说了这么多,也只是想提醒自己,也提醒大家. 一定是先完成工作.再休息娱乐ヽ(`Д′)? 牢记小

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接,可以看到什么样的效果 package com.lgl.socket; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; publ

QT开发(十四)——QT绘图系统

QT开发(十四)--QT绘图系统 一.QT绘图原理 Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter.QPainterDevice和 QPainterEngine.QPainter执行绘图操作,QPainterDevice提供绘图设备,是一个二维空间的抽象,QPainterEngine提供一些接口.QPainter用来执行具体的绘图相关操作,如画点,画线,填充,变换,alpha通道等.QPaintDevice类是能够进行绘

NHibernate 存储过程 第十四篇

NHibernate 存储过程 第十四篇 NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DELETE FROM Person WHERE PersonId = @Id; 修改映射文件,添加删除对象的存储过程: <?xml version="1.0" encoding="utf-8" ?> <hiber

解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)

原文:解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译) 解剖SQLSERVER 第十四篇    Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究vardecimals 是怎麽存储在磁盘上的. 作为一般的介绍vardecimals 是怎样的,什么时候应该使用,怎样使用,参考这篇文章 vardecimal 存储格式启用了吗? 首先,我们需要看一下vardecim

第三十四章

11 道渢(fēng)呵,其可左右也.万物恃之以生而不辞,成功遂事而弗名有也.万物归焉而弗为主.则恒无欲也,可名于小.万物归焉而弗为主,可名于大.是以圣人之能成大也,以其不为大也,故能成大. 第三十四章1 相当比例的人,因占有心而生病 道渢呵,其可左右也.万物恃之以生而不辞(帛书未见此句),成功遂事而弗名有也.万物归焉而弗为主.则恒无欲也,可名于小. 道广泛盛大,充满左右无处不在.它生养万物而不推辞这个庞大的工作,完成了这些事而不说是自己所拥有的.万物源于它但它不说自己是主人.道没有欲望,所以可

Egret入门学习日记 --- 第六十四篇(书中 19.4 节 内容)

第六十四篇(书中 19.4 节 内容) 昨天的问题,是 images 库自己本身的问题. 我单独使用都报错. 这是main.js文件代码: let images = require("images"); console.log(images); 这是cmd运行命令历史: Microsoft Windows [版本 10.0.16299.15] (c) 2017 Microsoft Corporation.保留所有权利. C:\Users\Administrator\Desktop\a&