iphone应用程序编程指南( 图形和描画)分类:DotNet 发布时间:2012/4/4 23:11:40
高质量的图形是应用程序用户界面的重要组成部分。提供高质量的图形不仅会使应用程序具有好的的外观,还会使它看起来象是系统的自然扩展。iPhone OS为创建高质量的图形提供两种路径:即通过OpenGL进行渲染,或者通过Quartz、Core Animation、和UIKit进行渲染。 OpenGL框架主要适用于游戏或要求高帧率的应用程序开发。它是一组基于C语言的接口,用于在桌面电脑上创建2D和3D内容。iPhone OS通过OpenGL ES框架来支持OpenGL描画,该框架同时支持OpenGL ES 2.0和OpenGL ES v1.1。OpenGL ES是特别为嵌入式硬件系统设计的,和桌面版本的OpenGL有很多不同。 对于希望采用更为面向对象的方法进行描画的开发者,iPhone OS提供了Quartz、Core Animation、还有UIKit中的图形支持。Quartz是主要的描画接口,支持基于路径的描画、抗锯齿渲染、渐变填充模式、图像、颜色、坐标空间变换、以及PDF文档的创建、显示、和分析。UIKit为Quartz的图像和颜色操作提供了Objective-C的封装。Core Animation为很多UIKit的视图属性声明的动画效果提供底层支持,也可以用于实现定制的动画。 本章将为iPhone应用程序的描画过程提供一个概览,同时介绍描画技术的一些具体描画技巧。本章还为如何优化iPhone OS平台的描画代码提供一些指导原则和小贴士。 UIKit的图形系统在iPhone OS上,所有的描画—无论是否采用OpenGL、Quartz、UIKit、或者Core Animation—都发生在 对于Quartz、Core Animation、和UIKit,您需要使用本文下面部分描述的概念。 视图描画周期
任何时候,当视图的一部分需要重画时,
在调用 坐标和坐标变换如“视图坐标系统”部分描述的那样,窗口或视图的坐标原点位于左上角,坐标的值向下向右递增。当您编写描画代码时,需要通过这个坐标系统来指定描画内容中点的位置。 如果您需要改变缺省的坐标系统,可以通过修改当前的转换矩阵来实现。当前转换矩阵(CTM)是一个数学矩阵,用于将视图坐标系统上的点映射到设备的屏幕上。在视图的 修改CTM是在视图内容描画的标准技术,因为它需要的工作比其它方法少得多。如果您希望在当前描画系统中坐标为(20, 20)的位置上画出一个10 x 10的方形,可以首先创建一个路径,将它的起始点移动到坐标为(20, 20)的位置上,然后再画出组成方形的几条线。然而,如果您在之后希望将方形移动到坐标为(10, 10)的位置上,就必须用新的起始点重新创建路径。事实上,每次改变原点,您都必须重新创建路径。创建路径是开销相对较大的操作,相比之下,创建一个起始点为(0, 0)的方形,然后通过修改CTM来匹配目标描画原点的开销就少一些。 在Core Graphics框架中,有两种修改CTM的方法。您可以通过CGContext参考定义的CTM操控函数来直接修改CTM,也可以创建一个 图形上下文在调用您提供的 当您希望在视图之外的其它地方进行描画时,可以创建定制的图形上下文对象。在Quartz中,当您希望捕捉一系列描画命令并将它们用于创建图像或PDF文件时,就需要这样做。您可以用 您创建的定制图形上下文的坐标系统和iPhone OS使用的本地坐标系统是不同的。与后者的坐标原点位于左上角不同的是,前者的坐标原点位于左下角,其坐标值向上向右递增。您在描画命令中指定的坐标必须对此加以考虑,否则,结果图像或PDF文件在渲染时就可能会发生错误。 重要提示:由于在位图或PDF上下文中进行描画时使用的是左下原点,所以在将描画结果渲染到视图上的时候,必须对坐标系统进行补偿。换句话说,如果您创建一个图像,并调用 如果使用 有关图形上下文、如何修改图形状态信息、以及如何用图形上下文来创建定制内容的更多信息,请参见Quartz 2D编程指南。如果需要与图形上下文结合使用的函数列表,则请参见CGContext参考、CGBitmapContext参考、以及CGPDFContext参考。 点和像素的不同Quartz描画系统使用基于向量的描画模型,这不同于基于栅格的描画模型。在栅格描画模型中,描画命令操作的是每个独立的像素,而Quartz的描画命令则是通过固定比例的描画空间来指定,这个描画空间就是所谓的用户坐标空间。然后,由iPhone OS将该描画空间的坐标映射为设备的实际像素。这个模型的优势在于,使用向量命令描画的图形在通过仿射变换放大或缩小之后仍然显示良好。 为了维持基于向量的描画系统固有的精度,Quratz描画系统使用浮点数(而不是定点数)作为坐标值。使用浮点类型的坐标值可以非常精确地指定描画内容的位置。在大多数情况下,您不必担心这些值最终如何映射到设备的屏幕。 用户坐标空间是您发出的所有描画命令的工作环境。该空间的单位由点来表示。设备坐标空间指的是设备内在的坐标空间,由像素来表示。缺省情况下,用户坐标空间上的一个点等于设备坐标空间的一个像素,这意味着一个点等于1/160英寸。然而,您不应该假定这个比例总是1:1。 颜色和颜色空间iPhone OS支持Quartz中具有的所有颜色空间,但是,大多数应用程序应该只需要RGB颜色空间,因为iPhone OS是为嵌入式硬件设计的,而且只在一个屏幕上显示,在这种场合下,RGB颜色空间是最合适的。
您也可以使用Core Graphics框架中的 支持的图像格式表4-1列出了iPhone OS直接支持的图像格式。在这些格式中,我们优先推荐PNG格式。
描画贴士本文的下面部分将为您提供一些贴士,讨论如何在编写高质量描画代码的同时确保应用程序外观对最终用户具有吸引力。 确定何时使用定制的描画代码根据您创建的应用程序类型,不使用或使用很少的定制代码进行描画是可能的。虽然沉浸式的应用程序通常广泛使用定制的描画代码,但是工具型和效率型的应用程序则可以使用标准的视图和控件来显示内容。 定制描画代码的使用应该限制在当显示在屏幕上的内容需要动态改变的场合。比如,用于跟踪用户描画命令的应用程序需要使用定制描画代码;还比如,游戏程序也需要经常更新屏幕,以反映游戏环境的改变。在那些情况下,您需要选择合适的描画技术,以及创建定制的视图类来正确处理事件和更新屏幕。 另一方面,如果应用程序中大量的用户界面是固定的,则可以事先将那些界面渲染到一或多个图像文件中,然后在运行时通过 提高描画的性能在任何平台上,描画的开销都比较昂贵,对描画代码进行优化一直都是开发过程的重要步骤。表4-2列举了几个贴士,用于确保您的描画代码得到尽可能的优化。除了这些贴士,您还应该用现有的性能工具对代码进行测试,消除描画热点和多余的描画操作。
保持图像的质量为用户界面提供高品质的图像应该是设计工作中的重点之一。图像是一种合理而有效的显示复杂图形的方法,任何合适的地方都可以使用。在为应用程序创建图像的时候,请记住下面的原则:
用Quartz和UIKit进行描画Quartz是iPhone OS的窗口服务器和描画技术的一般叫法。Core Graphics框架是Quartz的核心,也是内容描画的基本接口。该框架提供的数据类型和函数用于操作如下对象:
UIKit在Quartz基本特性的基础上提供了一组专门的类,用于与图形相关的操作。UIKit的图形类并不是为了向您提供一个全面的描画工具箱—因为这样的工具在Core Graphics框架中已经有了,而是为了向其它UIKit类提供描画支持。UIKit包括下面的类和函数:
有关UIKit包含的类和方法的信息,请参见UIKit框架参考,有关组成Core Graphics框架的封装类型和函数,请参见Core Graphics框架参考。 配置图形上下文在您的
图形上下文中包含一个保存过的图形状态堆栈。在Quartz创建图形上下文时,该堆栈是空的。 有关图形上下文及如何用它来配置描画环境的一般信息,请参见Quartz 2D编程指南的图形上下文部分。 创建和描画图像iPhone OS同时支持通过UIKit和Core Graphics框架装载和显示图像。到底选择哪些类和函数描画图像取决于具体的应用场合。但是,我们推荐您尽可能使用UIKit来表示图像。表4-4列举了一些使用场景及处理这些场景的推荐方法。
下面的例子将展示如何从应用程序的程序包中装载一个图像。在该图像装载完成后,您可以将它用于初始化
在视图的
重要提示:如果您使用 创建和描画路径路径用于描述由一序列线和Bézier曲线构成的2D几何形状。UIKit中的 在创建路径时,需要首先通过 在视图上描画路径时,可以描画轮廓,也可以进行填充,或者同时进行这两种操作。路径轮廓可以用像 有关如何描画路径的更多信息,包括如何为复杂路径元素指定点的信息,请参见Quartz 2D编程指南的路径部分。有关路径创建函数的信息,则请参见CGContext参考和CGPath参考。 创建样式、渐变、和阴影Core Graphics框架还包含一些用于创建样式、渐变、和阴影类型的函数。基于这些类型,您可以创建复杂的颜色,并用它们来填充自己创建的路径。样式是从重复出现的图像或内容创建而来的,渐变和阴影则是不同颜色之间平滑过渡的方式。 有关创建样式、渐变、和阴影的详细信息,在Quartz 2D编程指南中进行讨论。 用OpenGL ES进行描画开放图形库(Open Graphics Library,即OpenGL)是一个跨平台的、基于C语言的接口,用于在桌面系统中创建2D和3D内容。游戏或需要以高帧率进行描画的开发者通常需要使用这个接口。您可以用OpenGL函数来指定图元结构,比如点、线、多边形和纹理,以及增强这些结构外观的特殊效果。您调用的函数会将图形命令发送给底层的硬件,然后由硬件进行渲染。由于大多数渲染工作是由硬件来完成,所以OpenGL的描画速度通常很快。 OpenGL的嵌入式系统版本是OpenGL的精简版本,是专门为移动设备设计的,可以充分利用现代图形硬件的优势。如果您希望为基于iPhone OS的设备—也就是iPhone或iPod Touch—创建OpenGL内容,就要使用OpenGL ES。iPhone OS系统提供的OpenGL ES框架( 有关iPhone OS系统上的OpenGL ES的更多信息,请参见iPhone OpenGL ES编程指南. 应用Core Animation的效果Core Animation是一个Objective-C语言的框架,其目的是为快速创建实时动画提供基础设施。Core Animation本身并不是一个描画技术,因为它并不提供创建形状、图像、或其它内容的基本例程;相反,它是一种操作和显示由其它技术创建的内容的技术。 在iPhone OS上,大多数程序都会以某种形式受益于Core Animation技术。动画可以将当前正在发生的事情呈现给用户。比如,在用户使用Settings程序时,屏幕会根据用户是向预置的更深层次移动还是返回根结点而滑入或滑出视图。这种反馈是很重要的,可以为用户提供上下文的信息。动画还可以增强应用程序的视觉效果。 大多数情况下,您通过很少的工作就可以得到Core Animation的好处。举例来说,您可以对 如果您要超越基本的动画效果,就必须直接和Core Animation的类及方法进行更多的交互。本文的下面部分将进一步提供有关Core Animation的信息,向您展示如何用它提供的类和方法创建iPhone OS上的典型动画。更多有关Core Animation及其用法的信息,请参见Core Animation编程指南。 关于层Core Animation的关键技术是层对象。层是一种轻量级的对象,在本质上类似于视图,但实际上是模型对象,负责封装显示内容的几何属性、显示时机、和视觉属性变量。内容本身可以通过如下三种方式来提供: 当您操作层对象的属性时,您真正操作的是模型级别的数据,该数据决定了与之关联的内容应该如何被显示,而实际的渲染则由您的代码之外的模块来处理,系统对这个过程进行了大量的优化,确保渲染工作能快速完成。您需要做的只是设置层的内容和配置动画属性,然后让Core Animation接管剩下的工作。 更多有关层及如何使用层的信息,请参见Core Animation编程指南。 关于动画对于具有动画效果的层,Core Animation使用独立的动画对象来控制动画的时机和行为。 Core Animation还可以将多个动画组合为一个单独的单元,称为事务。 如果您需要如何创建定制动画的实例,请参见动画类型和时机的编程指南。 |
|


最新评论