Core Animation Basics(apple官方文档翻译与学习02)

来源:互联网 发布:起小点的淘宝店 编辑:程序博客网 时间:2024/06/01 10:42

核心动画为应用程序的animating view和其他的可视元素提供了一个通用的目标系统。核心动画不是应用程序view的替代。相反,它是一种与view相结合的技术,以提供更好地表现效果,为view的内容可动提供支持。它通过缓存view的内容到bitmap来实现。在某些情况下,这种缓存行为可能需要你重新思考如何展现和管理你的app的内容,但是大多数时候,你使用核心动画甚至不知道核心动画就在那里。除了缓存view的内容,核心动画还定义了一种方式来指定任意的可视内容,整合该可视内容与你的view,并使它动起来。你使用核心动画使你的app的view和可视化对象的改变动起来。大多数改变与修改你的可视化对象的属性相关。例如,你可以使用核心动画来动画呈现view的位置、尺寸、透明度的改变。当你做了属性的改变,核心动画会在当前属性值和你新指定的值之间做动画。你通常不会使用核心动画每秒60次地替换一个view的内容,就像卡通片一样。相反,你使用核心动画在屏幕上移动view的内容,让内容淡入淡出,对view进行图形变换,或者改变视图的其他视觉属性。

1.层提供了画图和动画的基础

layer对象时3D空间中的2D表面,是你使用核心动画所做的一切的核心。类似于view,layer管理几何、内容和layer表面的可视属性。不同于view,layer不定义自己的外表。一个layer仅仅管理一个位图(bitmap)周围的状态信息。位图本身可以是一个view绘制本身的结果或者是你指定一个固定的图像。基于此,你的app中使用的main layers被认为是模型对象,因为它们主要管理数据。这个概念很重要,要记住,因为它影响着动画的行为。

1.1基于层的绘图模式

大多数layer不在你的app中做实际的绘画工作。相反,一个layer捕获你的app提供的内容(content),并且缓存它于位图中(bitmap),有时它被称为后备存储器。当你随后改变layer的属性,所有你在做的就是改变与layer相关的状态信息。当一个改变出发了一个动画时,核心动画传递layer的bitmap和状态信息给图形硬件,图形硬件使用新的信息来渲染bitmap,如图1-1所示。在硬件中操纵位图比在软件中操纵要产生更快的动画。
图1-1
因为它操纵一个静态位图,所以基于layer的绘图完全不同于更传统的基于view的绘图技术。基于view的绘图,view的改变常常导致调用view的drawRect:方法,使用新参数来重绘内容。但是这种绘图方式很昂贵,因为它是通过在主线程使用CPU来做的。核心动画尽可能地避免这个花费,通过在硬件中控制缓存位图来实现相同或类似的效果。虽然核心动画尽可能使用缓存内容,但是你的app还是必须提供初始内容,并且不时地更新它。你的app可以有多种方式来提供一个layer对象,这将在“Providing a Layer’s Contents”中详细描述。

1.2基于层的动画

一个layer对象的数据和状态信息与layer在屏幕上显示内容的可视化表现是分离的。这种解耦合为核心动画提供了一种方式来使改变动起来(从旧的状态值到新的状态值)。例如,改变一个layer的位置属性,会导致核心动画移动这个layer从当前位置到新设定的位置。类似的其它属性的改变会导致相应的动画。图1-2显示了一些你可以在layer上执行的动画类型。

Examples of animations you can perform on layers

动画过程中,核心动画在硬件中逐帧给你绘图。所有你要做的就是指定动画的开始点和结束点和让核心动画休息。您还可以根据需要指定自定义时间信息和动画参数;你不指定的话,核心动画提供了默认值。
想或得更多关于如何启动动画和配置动画参数的信息,请看Animating Layer Content。

2.layer定义自己的几何结构

layer的工作之一就是管理它的内容的可视化几何结构。可视化几何结构包含了这些信息:内容的边界(bounds),在屏幕上的位置,layer是否被旋转、缩放或以任何方式被改变。类似于view,layer有frame、bounds,所以你可以它们设定layer和layer的内容的位置。layer还有view没有的属性,比如锚点(anchor point)。

2.1layer使用两种类型的坐标系

layer使用点坐标系和单元坐标系来指定内容的位置。到底使用哪种坐标系取决于传达的信息的类型。当指定的值直接映射到屏幕坐标,或者这个值必须被指定为相对于另一个layer的值,例如设定layer的position属性。当这个值不应该绑定到屏幕坐标中时,使用单元坐标系,因为它与别的值相关。例如,layer的锚点属性指定一个点相对于layer本身的bounds,而bounds本身是可以改变的。点坐标系最常用于指定layer的size和position。bounds定义了layer本身的坐标系,并且包括layer在屏幕上的尺寸。position属性定义了layer相对于它的父坐标系的位置。虽然layer有frame属性,但是这个属性实际来自于bounds和position属性的值,并且使用频率较低。layer的bounds和frame的方向总是与底层平台的默认方向匹配。图1-3显示了在iOS和OS X中的默认方向。在iOS中,边界矩形的起源是在层的左上角,在OS X中在左下侧的角落。如果你在iOS和mac OS X之间共享核心动画代码,你必须考虑这些差异。

图1-3

1 0
原创粉丝点击