第一章      核心动画概念

核心动画是一套包含图形绘制,投影,动画的Objective–C类集合。它通过开发人员所熟悉的应用程序套件和Cocoa Touch视图架构的抽象分层模式,同时使用先进的合作效果提供了一套流畅的动画。

动态的动画接口很难创建,但是核心动画通过提供如下接口使这些创建起来变得更加简单:

  • 简单易用的高性能混合编程模型。
  • 类似视图一样,你可以通过使用图层来创建复杂的接口。
  • 轻量级的数据结构,它可以同时显示并让上百个图层产生动画效果。
  • 一套简单的动画接口,可以让你的动画运行在独立的线程里面,并可以独立于主线程之外。
  • 一旦动画配置完成并启动,核心动画完全控制并独立完成相应的动画帧。
  • 提高应用性能。应用程序只当发生改变的时候才重绘内容。再小的应用程序也需要改变和提供布局服务层。核心动画还消除了在动画的帧速率上运行的应用程序代码。
  • 灵活的布局管理模型。包括允许图层相对同级图层的关系来设置相应属性的位置和大小。

使用核心动画,开发人员可以为他们的应用创建动态用户界面,而无需使用低级别的图形API,如OpenGL来获取高效的动画性能。

 

1.1 核心动画类

核心动画类有以下分类:

  • 提供显示内容的图层类。
  • 动画和计时类。
  • 布局和约束类。
  • 事务类,在原子更新的时候组合图层类。

核心动画的基础类包含在Quartz核心框架(Quartz Core framework)里面,虽然它的其他图层类在其他框架里面定义。下图显示了核心动画的类层次结构。

图 1  Core Animation 类结构

 

 

1.1.1 图层类(Layer Classes)

图层类是核心动画的核心基础,它提供了一套抽象的概念(假如你使用过NSView或者UIView的话,你一定会对它很熟悉)。CALayer是整个图层类的基础,它是所有核心动画图层类的父类。

和视图类(NSView或UIView)一样,CALayer有自己的父图层类,同时也拥有自己子图层类的集合,它们构成了一个图层树的层次结构。图层绘制类似视图一样自底向上,并指定其几何形状相对他们superlayer,创建一个相对的局部坐标系。然而图层类通过合并变换矩阵允许你旋转、偏移、拉伸对应的图层内容。具体内容将会在后面“图层(Layer)的几何和变换”部分介绍。

CALayer从Application Kit 和Cocoa Touch的视图类分离出来,因为没有必要为了显示内容而继承CALayer类。因为CALayer类的内容显示可以通过以下方法提供:

  • 可以直接或者委托的方式把图层的内容属性设置为Core Graphics image。
  • 提供直接绘制到一个Core Graphics image上下文委托。
  • 设置所有图层所具有的可视化样式属性,比如背景颜色、不透明属性、蒙版等。

Mac OS X应用同样可以通过核心图像滤镜来访问它的可视化样式属性。

继承CALayer并通过封装方法实现以上任何技术。

“提供图层内容”描述了提供内容层可用方法。可视化样式样式属性和它们的顺序将会在 “图层样式属性”部分详细介绍。

除了CALayer类,核心动画类同时提供了显示其他内容的类。这些类在Mac OS X 和 iOS上有细微的差别,以下类在Mac OS X和iOS上都可用:

  • CAScrollLayer 是CALayer的子类,简化显示图层的一部分内容。CAScrollLayer对象的滚动区域的范围在它的子图层里面定义。CAScrollLaye不提供键盘或鼠标事件处理,也不提供可见的滚动条。
  • CATextLayer 可以方便的从字符串或字符串的内容创建一个图层类的内容。
  • CATiledLayer 允许递增的显示大而复杂的图片。

Mac OS X 提供如下额外的类:

  • CAOpenGLLayer 提供了一个OpenGL渲染环境。你必须继承这个类来使用OpenGL提供的内容。内容可以是静态的,或可随着时间的推移更新。
  • QCCompositionLayer (由Quartz框架提供)可以把Quartz合成的内容动画显示。
  • QTMovieLayer and QTCaptureLayer (QTKit框架提供)提供播放QuickTime影片和视频直播。

iOS 提供如下额外的类:

  • CAEAGLLayer 提供了一个OpenGLES渲染环境。

CALayer的类引入键-值编码兼容的容器类概念,也就是说一个类可以使用键 - 值编码的方法存储任意值,而无需创建一个子类。CALayer的还扩展了NSKeyValueCoding的非正式协议,加入默认键值和额外的结构类型的自动对象包装(CGPoint,CGSize,CGRect,CGAffineTransform和CATransform3D)的支持,并提供许多这些结构的关键路径领域的访问。

CALayer同时管理与层关联的动画和行为,。图层接受层树的插入和删除层动作,修改层的属性,或者明确的开发请求。这些行为通常会导致动画发生。见“动画”和“图层操作”的更多信息。

 

1.1.2    动画和计时类

图层的很多可视化属性是可以隐式动画的。通过简单的改变图层的可动画显示的属性,可以让图层现有属性从当前值动画渐变到新的属性值。例如设置图层的hidden属性为YES将会触发动画使层逐渐淡出。大多数动画属性拥有自己关联的默认动画,你可以轻松地定制和替换。我们将会在后面“动画属性”部分列出一个完整的动画属性列表和它们相应的默认动画。动画的属性也可以显式动画。要显式动画的属性,你需要创建核心动画动画类的一个实例,并指定所需的视觉效果。显式动画不会改变该属性的值,它只是用于动画显示。

核心动画的动画类使用基本的动画和关键帧动画把图层的内容和选取的属性动画的显示出来。所有核心动画的动画类都是从CAAnimation类继承而来。CAAnimation实现了CAMediaTiming协议,提供了动画的持续时间,速度,和重复计数。CAAnimation也实现了CAAction协议。该协议为图层触发一个动画动作提供了提供标准化响应。

动画类同时定义了一个使用贝塞尔曲线来描述动画改变的时间函数。例如,一个匀速时间函数(linear timing function)在动画的整个生命周期里面一直保持速度不变,而渐缓时间函数(ease-out timing function)则在动画接近其生命周期的时候减慢速度。

 

核心动画额外提供了一系列抽象的和细化的动画类,比如:

CATransition 提供了一个图层变化的过渡效果,它能影响图层的整个内容。动画进行的时候淡入淡出(fade)、推(push)、显露(reveal)图层的内容。这些过渡效果可以扩展到你自己定制的Core Image滤镜。

  • CAAnimationGroup 允许一系列动画效果组合在一起,并行显示动画。
  • CAPropertyAnimation 是一个抽象的子类,它支持动画的显示图层的关键路径中指定的属性
  • CABasicAnimation 简单的为图层的属性提供修改。
  • CAKeyframeAnimation支持关键帧动画,你可以指定的图层属性的关键路径动画,包括动画的每个阶段的价值,以及关键帧时间和计时功能的一系列值。在动画运行是,每个值被特定的插入值替代。

 

核心动画 和 Cocoa Animation 同时使用这些动画类。使用动画描述,是因为这些类涉及到核心动画,这些将会在Animation Types and Timing Programming Guide 有较深入的讨论。

 

1.1.3    布局管理器类

Application Kit的视图类相对于superlayer提供了经典的“struts and springs”定位模型。图层类兼容这个模型,同时 Mac OS X上面的核心动画提供了一套更加灵活的布局管理机制,它允许开发者自己修改布局管理器。核心动画的 CAConstraint 类是一个布局管理器,它可以指定子图层类限制于你指定的约束集合。每个约束(CAConstraint类的实例封装)描述层的几何属性(左,右,顶部或底部的边缘或水平或垂直中心)的关系,关系到其同级之一的几何属性层或superlayer。

通用的布局管理器和约束性布局管理器将会在“布局核心动画的图层”部分讨论。

 

1.1.4    事务管理类

图层的动画属性的每一个修改必然是事务的一个部分。CATransaction是核心动画里面负责协调多个动画原子更新显示操作。事务支持嵌套使用。

核心动画支持两种事务:隐式事务显式事务。在图层的动画属性被一个线程修改,同时该线程下次迭代的时候自动提交该修改的时候隐式事务自动创建。显式事务发生在程序在修改动画属性之前给CATransaction发送了一个开始消息,在动画属性修改之后提交该消息。

事务管理将会在后面的“事务”部分详细介绍。

评论模块尚未加载