iPhone Application Programming Guide - Graphics and Drawing

本文详细介绍iOS平台上的绘图技术,包括使用UIKit和CoreGraphics进行图形绘制的方法,如何提高绘图性能,以及使用OpenGL ES进行高性能图像渲染的技术要点。

【iPhone Application Programming Guide, Ch4】

【补充说明:部分细节有待验证】

iPhone自带的库:
quartz
core animation
UIKit

1. UIKit
所有对图形的调用都封装在UIView的实例中;

1.1 画图:
UIView drawRect
第一次画图时,将全图绘制,以后根据实际情况绘制。
有以下行为会触发view更新:
(1)其他的view掩盖当前view;
(2)将隐藏view显示;
(3)scrollling view,然后再返回
(4)显式调用setNeedsDisplay、setNeedsDisplayInRect:

如果要更改显示内容,必须使用方法(4)触发更新。

1.2 坐标系和坐标变换:
当前坐标系(CTM):定义在CGContext中
创建CGAffineTransform结构做坐标变换。

1.3 图形上下文:
画图前,view会自动的配置环境,创建图形上下文(CGContextRef)
包括信息:图像,区域,线的宽度,字体等等

可以创建自己的上下文(CGBitmapContextCreate  CGPDFContextCreate)
【使用自己的上下文时,坐标原点在左下角,而不是标准的左上角】

参考:Quartz 2D Programming Guide
Q:CGContext Reference是个什么东西?

1.3 points VS. pixels
Quartz绘图使用基于向量的绘图模型。
Quartz使用的绘图空间user coordinate space被系统映射到实际的像素点。
精确性考虑,绘图坐标使用浮点数,而不是整数。

device coordinate space:通过像素来表达。
通常情况下,一个point映射到一个pixels

1.4 Color and Color Spaces
推荐使用RGB Color

(UIColor, )
CGContextSetRGBStrokeColor
CGContextSetRGBFillColor

1.5 图像类型
推荐使用:PNG
支持的图像类型:png, tif, jpg, gif, bmp, ico, cur, xbm


2. Drawing Tips

2.1 何时使用自定义绘图
显示内容需要动态改变时使用,否则不推荐使用自定义绘图。

可以使用UIIMageView显示
(UILable)

2.2 Improving Drawing Performance
(1)Draw minimally
(2)Mark opaque views as such:设置view的opaque属性为yes
(3)Remove alpha channels from PNG files:
(4)Reuse table cells and views during scrolling
翻页时应当避免创建新的view,会影响展示。
(5)Avoid clearing the previous content during scrolling
默认:UIKit会清空一个view当前的上下文buffer,然后再调用view的drawRect:
对于翻页,应当设置view的clearsContextBeforeDrawing为NO
(6)Minimize graphics state changes while drawing

2.3 Maintaining Image Quality
建议使用PNG图像格式;
使用大小合适的图片而不是scale,如果需要展现一个图片的不同大小,建议对一个图片搞多个版本;

3 Drawing with Quartz and UIKit
Quartz:iPhone绘图功能的总称。
Core Graphics framework是quartz的核心部分和主要接口。
内容:
Graphics context
Paths
Images and bitmaps
Transparency layer
Colors, pattern colors, and color spaces
Gradients and shadings
fonts
PDF Content

UIKit的图形类:
(1)UIImage
(2)UIColor
(3)UIFont
(4)UIScreen:screen的基本信息

可参考:
Core Graphics framework reference

3.1 配置图形上下文
UIGraphicsGetCurrentContext:得到Graphics context()的引用
通过调用Core Graphics的函数,可以修改当前的图形状态(Graphics state)。

(1)当前转换矩阵(CTM,current transformation matrix)
CGContextRotateCTM
CGContextScaleCTM
CGContextTranslateCTM
CGContextConcatCTM
(2)剪贴区
CGContextClipToRect
(3)线
CGContextSetLineWidth
CGContextSetLineJoin
CGContextSetLineCap
CGContextSetLineDash
CGContextSetMiterLimit

(4)平滑性
CGContextSetFlatness
(5)抗锯齿设置
CGContextSetAllowsAntialiasing
(6)颜色
CGContextSetRGBFillColor
CGContextSetRGBStrokeColor
【在UIKit的层次,对颜色的操作,也可以通过UIColor来实现】
(7)透明(Alpha值)
CGContextSetAlpha
(8)色彩对应方式(Rendering intent)
CGContextSetRenderingIntent
(9)色彩空间(Color space)
CGContextSetFillColorSpace
CGContextSetStrokeColorSpace
(10)文本(字体,大小,etc)
CGContextSetFont
CGContextSetFontSize
CGContextSetCharacterSpacing
【在UIKit层次,用UIFount类也可以实现】
(11)混合模式(blend mode)
CGContextSetBlendMode
【UIImage也可以指定blend mode】


Graphic context包括了graphics状态的一个队列。
context创建时为空,调用CGContextSaveGState将当前的state推入队列。
完成自定义绘图后,可以通过CGContextRestoreGState恢复保存的state。


3.2 创建和绘制Image
iPhone可以通过UIKit或者Core Graphics 的frameworks载入和展现image。
建议使用UIKit类对图像进行操作。
(1)在view中作为内容展现  -- image是view
使用UIIMageView
(2)在view中作为装饰展现  -- image是view的一部分
使用UIImage
(3)将位图数据保存到image
UIKit的方式:
- 使用UIFraphicBeginImageContext创建一个image based图形上下文;
- 画图;
- 调用UIGraphicsGetImageFromCurrentImageContext来产生一个image;
- 调用UIGraphicsEndImageContext关闭图形上下文。

Core Graphics的方式:
- 使用CGBitmapContextCreate创建一个bitmap图形的上下文
- 画图;
- 使用CGBitmapContextCreateImage创建一个CGImageRef(?)
(4)image保存问jpeg/png
- 创建一个UIImage对象;
- 调用UIImageRepreseating/UIImagePNGRepresentation获取一个NSData的对象;
- 保存NSData到相应的文件格式;

绘图:
[view drawRect]
     [Image drawAtPoint:]

Tips: Quartz图像左边起始是在左下角,向右,向上是正方向。


3.3 创建和绘制Path
path:使用线和贝塞尔曲线描述的图形

UIKit对path的操作:
UIRectFrame
UIRectFill

Core Graphics对path的操作:<>

创建path:
- CGContextBeginPath配置图形上下文
- 画图
  - CGContextStrokePath:创建一个line
  - CGContextFillPath
- 创建CGPathRef/CGMutablePathRef来保存对path的引用


3.4 模式、渐变、阴影 (Patterns,Gradients and Shadings)
Core Graphic提供的功能,可以创建渐变色填充path

Pattern:repeating images or content
Gradients/Shading:提供颜色的渐变功能


4. Drawing with OpenGL ES
用于绘制高帧率图像,绘图在硬件完成,所以OpenGL绘图通常非常快。

iPhone支持:OpenGLES.framework

可参考:OpenGL ES Programming Guide for iPhone OS


5. Core Animation Effects
Core Animation: Object C的framework,用于创建流,实时动画。
本身不具备创建画图能力。

基本动画:【可参看page71,Animating views】

【可参看Core Animation Programming Guide】

5.1 Layer
Core Animation的核心技术。
Layer是类似于view的轻量级对象,但其实际上是model对象,封装了图形,时间和可视属性等内容。

三种方式处理Layer的展示:
(1)将一个CGImageRef赋值给layer对象的contents
(2)将一个delegate赋给一个layer对象并处理绘图
(3)继承CALayer并重载其展现方式;

对layer的操作实质上时对model层次数据的操作。

【??】

5.2 Animations
CAAnimation类

多个动画组合成一个transactiong。
CATransaction类

【自定义动画:可参考:Animation types and timing programming guide】

 

 

源码链接: https://pan.quark.cn/s/dbe32f6bace6 在本指南中,我们将详细解析如何在银河麒麟v10操作系统平台上完成MySQL 5.7的安装过程。银河麒麟v10作为一个基于Linux内核的国产操作系统,特别适用于arm架构的aarch64计算平台。鉴于我们讨论的是免编译的安装方法,这意味着我们将借助预先编译好的二进制软件包来简化操作步骤,而非采用从源代码开始的编译方式。 ### 一、前期准备 1. **系统更新**: 在部署任何新软件之前,务必确保操作系统处于最新状态,此举旨在规避潜在的兼容性挑战和已知的安全隐患。 ``` sudo apt-get update sudo apt-get upgrade ``` 2. **依赖安装**: MySQL 5.7版本在运行时可能需要特定的库文件支持,比如libaio和jemalloc。在银河麒麟v10环境中,可以通过以下指令来安装这些必需的依赖项: ``` sudo apt-get install libaio1 libaio-dev jemalloc-dev ``` ### 二、获取MySQL 5.7二进制文件 由于银河麒麟v10运行在arm架构之上,因此需要寻找适配aarch64架构的MySQL 5.7二进制文件。这些文件可从MySQL的官方发布渠道或授权的第三方镜像站点获取。务必确认下载的文件名与压缩包内的内容一致。例如,文件名应为`mysql-5.7.37-linux-glibc2.17-arm64.tar.gz`。 ### 三、部署MySQL 5.7 1. **文件解压缩**: 将下载的MySQL压缩文件解压至一个指定目录,例如 `/usr/local/`。 ``` tar...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 Node.js 是一种开放源代码且能够在多种操作系统上运行的 JavaScript 执行环境,它使得开发人员能够在服务器端执行 JavaScript 代码。Node.js 采用了 V8 引擎,该引擎是由 Google 为 Chrome 浏览器开发的一个高性能的 JavaScript 解释器。Node.js 的 16.x 版本在其发展历程中占据着重要位置,其中包含了众多新功能以及性能上的改进。标题 "Nodejs16-x64 windows安装包" 指向的是专为 Windows 操作系统设计的 64 位版本的 Node.js 16 安装程序。在 Windows 平台上安装 Node.js 的 64 位版本对于处理大量数据或运行需要高性能的应用程序来说尤为关键,因为 64 位系统能够更有效地利用硬件资源。描述 "Nodejs-16 x64位windows 安装包" 明确了该安装程序是为 Windows 用户准备的,特别是对于那些需要运行 64 位应用程序的用户。x64 表明该版本兼容 64 位架构,意味着它能够充分利用 64 位计算机的内存和处理能力。标签 "Node Nodejs nodejs16" 提供了关于此安装包的核心信息,表明它与 Node.js 相关,并且具体指的是 v16 版本。这些标签有助于进行搜索和分类,从而方便用户找到他们所需要的特定版本。压缩包文件 "node-v16.18.0-x64.msi" 代表实际的安装文件,其中 "v16.18.0" 指示了 Node.js 的具体版本号,"x64" 再次强调了其适用于 64 位系统,而 ".msi" 后缀表明这是一...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值