Core Animation 学习之路
Core Animation 是一个图形渲染和动画的基础设施,既可以使用在 Mac OS X 上也可以使用在 iOS 上。利用 Core Animation,所有你需要做的就是配置一些动画参数(如起始和结束点)。Core Animation 使用硬件加速,所以流畅的动画不会加重 CPU 的负担从而减慢你的应用程序。
CALayer 对象
Layer 对象是使用 Core Animation 一切东西的核心。Layers 管理应用可视化内容,提供改变演示和可视化内容的选项。
不同的 Layer 类提供专门的行为
Core Animation 定义了许多标准的 Layer 类,他们种的每一个都提供特殊的用途。CALayer 是所有这些 Layer 类的基类。它定义了所有 Layer 队形必须支持的行为,是 layer-backed 视图默认的类型。然而,你也可以使用下图中特定的 Layer 类:
提供 Layer 的内容
Layer 是数据对象 ,管理你应用程序提供的内容,一个 layer 的内容包括一个位图(包含你想展示的可视化的数据),你可以使用以下三种方式中的一种来提供位图的内容:
1.直接分配图片对象到 layer 对象的内容属性(对于从不或者很少改变的内容的 layer 是最好的一种技术
2.分配一个 delegate 对象到这个 layer,让这个 delegate 画出 layer 的内容(这种技术适用于 layer 内容周期性改变,可以提供一个额外的对象,比如 View)
3.定义一个 layer 子类,自己重写一个绘制方法来提供 layer 内容(这种技术适用于你需要创建一个 layer 子类或者你想改变 layer 的基础绘制行为)
layer-backed 的视图(iOS 下都是)自动提供了 layer 的内容。
①使用一张图片作为 Layer 的内容
因为一个 layer 就是一个管理位图图片的容器,所以你可以分配一张图片直接到 layer 的contents 属性。分配一张图片到一个图层很容易 让你指定精准的你想要展示在屏幕上的图片。layer 直接使用你提供的图片内容,不会尝试重新创建这张图片的拷贝。这种行为可以减少内存消耗,在节省内存的情况下可以在多个地方使用相同的图像
你提供的图片必须是个 CGImageRef
类型(在 OS X v10.6或者以后,你可以直接提供NSImage
类型),提供图片的时候,请注意提供图片的分辨率适配真实设备分辨率。
|
|
②使用 delegate 来提供 layer 的内容
如果你的 layer 内容是动态变化的,你可以使用 delegate 独享来提供和更新你想要的内容。展示时,layer 调取你的 delegate 方法来提供需要的内容
1)如果你的 delegate 实现了 diplayLayer:
方法,这个实现响应创建一个位图和分配它到图层的content属性
2)如果你的协议实现了 drawLayer:inContext:
方法,Core Animation 创建一个位图,创建一个 graphics context 来挥之位图,然后调取你的 delegate 方法来填充位图。所有你的协议方法会知道提供的 graphics context
备注:简单的说 displayLayer:方法,使用的内容是原本就有的 如图片等,而drawLayer:inContext:方法是在画布上画出一些内容。
协议必须实现 displayLayer
或者 drawLayer:inContext
方法,如果协议同时实现了这两个方法,这个 layer 仅会调用 displayer:
方法。
对于有自定义内容的 layer-backed 视图,你应该继续重写 view 的方法来实现你的绘制,layer-backed 视图自动让他、他的 layer 的 delegate 实现需要的 delegate 方法,你不能改变这种设置,而是应该实现你的 view 的 drawRect:
方法来绘制你的内容。
Layer 内容动画
Core Animation 提供的基础框架使得创建一个 layer 优雅的动画变得容易。使用 Core Animation,仅改变一个属性你就可以创建动画,你也可以自己创建动画,明确的设置动画参数。
简单改变 Layer 属性动画
你可以实现一个简单的动画,明确的或者不明确的。不明确的动画使用默认的时间和动画属性来完成动画,明确的动画需要自己来设置这些属性。所以简单的动画适用于你想使用默认时间、代码量少的动画。
不明确的动画写法:
明确的动画写法:
Keyframe Animation 来改变 Layer 属性动画
与CABasicAnimation(设置两个点 开始值、结束值)不同的是,一个CAKeyframeAnimation 可以设置一系列的目标值。例如改变边框粗细动画:
你也可以提供给路径给keyframeanimation,如 一个方块围着圆形路径旋转
执行一组动画
如果你想执行对一个 layer 执行多个动画,那就要使用 CAAnimationGroup 对象,例如对一个 layer 既执行 borderWidth
改变又要改变 borderColor
:
|
|
停止一个正在运行的明确动画
动画一般是完成时才停止,如果你要停止一个正在运行着的动画,你可以
调用 removeAnimationForKey
方法,key 是 addAnimation: forKey
时候的 key,他来指定动画唯一
如果想要 layer 上的所有动画,调用 removeAllAnimation:
方法
当你移除一个动画,Core Animation 通过使用当前值来重画 layer。因为当前值通常是动画的结束值,这样就会导致 layer 突然停止动画。如果你想让 layer 保持最后的动画 frame,你可以使用 layer 对象的展示树来获取最终值,然后赋给对象的 layer 树
监测动画的起始状态
Core Animation 有两种不同的方式来通知动画状态。
1.使用 setCompletionBlock:
方法添加完成 block 到当前处理。当所有的动画处理完成是,这个处理执行你的完成 block
2.分配 delegate 到你的 CAAnimation 对象,实现 animtaionDidStart:
方法和 animationDidStop: finished:
协议方法
Core Animation 类的继承关系图
参考文章:
苹果官方文档 Core Animation Guid
苹果官方:KeyPath
动画解释
Core Animation 之基础介绍