Core Animation学习感觉

如果需要PDF书籍、可以给我留言你的邮箱,我发到你邮箱。。。

花了一天时间把核心动画编程指南看完了,云里雾里,只是了解一些基本概念。两天后又看了第二遍,深有感触。当然这完全不能够自己来做一个Core Animation,因为需要一步一步的学习,理论是基础,可以参考这里(核心动画编程指南)来阅读,这些知识也是来自与那里,这是一些理论知识,但是实践也是建立在理论之上的,实践才是检验真理的唯一标准。在看的过程中其中印象深刻的有以下几点:

核心动画的一些概念

核心动画类有以下分类:

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

图层类是核心动画的核心基础,在心里一定深刻理解图层就是我们Layer层。CALayer是整个图层类的基础,它是所有核心动画图层类的父类。

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

CAScrollLayer 是CALayer的子类,简化显示图层的一部分内容。

CAScrollLayer对象的滚动区域的范围在它的子图层里面定义。CAScrollLaye不提供键盘或鼠标事件处理,也不提供可见的滚动条。

CATextLayer 可以方便的从字符串或字符串的内容创建一个图层类的内容。

CATiledLayer 允许递增的显示大而复杂的图片。

iOS 提供如下额外的类:

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

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

CAAnimation是什么呢?包含下面几种(会通过具体的代码来演示各种动画)

  1. CABasicAnimation
    通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。可以看做特殊的CAKeyFrameAnimation。

  2. CAKeyframeAnimation
    Keyframe顾名思义就是关键点的frame,你可以通过设定CALayer的始点、中间关键点、终点的frame,时间,动画会沿你设定的轨迹进行移动。
    支持关键帧动画,你可以指定的图层属性的关键路径动画,包括动画的每个阶段的价值,以及关键帧时间和计时功能的一系列值。在动画运行是,每个值被特定的插入值替代

  3. CAAnimationGroup
    Group也就是组合的意思,就是把对这个Layer的所有动画都组合起来。PS:一个layer设定了很多动画,他们都会同时执行,顺序后面会讨论。

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

  5. CAPropertyAnimation 是一个抽象的子类,它支持动画的显示图层的关键路径中指定的属性

Core Animation 渲染架构

  1. 图层树包含每一层的对象模型值。他们就是你设定的图层的属性值。
  2. 呈现树包含了当前动画发生时候将要显示的值,例如你要给图层背景颜色设置新的值的时候,它会立即修改图层树里面相应的值。但是在呈现树里面背景颜色值在将要显示给用户的时候才被更新为新值。
  3. 渲染树在渲染图层的时候使用呈现树的值。渲染树负责执行独立于应用活动的复杂操作。渲染由一个单独的进程或线程来执行,使其对应用程序的运行循环影响最小。

这些都是一些理论知识,知道每个层级树,要理解不是短时间的事,需要自己来练习、总结。我也不是很明白

指定图层的几何

虽然图层和图层树与视图和视图的结构在很多方面具有相似性,但是图层的几何却不同,它更加简单通俗。图层的所有几何属性,包括图层的矩阵变换,都可以隐式和显式动画。
下图显示可以在上下文中指定图层几何的属性:

图层的position属性是一个CGPoint的值,它指定图层相当于它父图层的位置,该值基于父图层的坐标系。

图层的bounds属性是一个CGRect的值,指定图层的大小(bounds.size)和图层的原点(bounds.origin)。当你重写图层的重画方法的时候,bounds的原点可以作为图形上下文的原点。

图层拥有一个隐式的frame,它是position,bounds,anchorPoint和transform属性的一部分。设置新的frame将会相应的改变图层的position和bounds属性,但是frame本身并没有被保存。但是设置新的frame时候,bounds的原点不受干扰,bounds的大小变为frame的大小,即bounds.size=frame.size。图层的位置被设置为相对于锚点(anchor point)的适合位置。当你设置frame的值的时候,它的计算方式和position、bounds、和anchorPoint的属性相关。

图层的anchorPoint属性是一个CGPoint值,它指定了一个基于图层bounds的符合位置坐标系的位置。锚点(anchor point)指定了bounds相对于position的值,同时也作为变换时候的支点。锚点使用单元空间坐标系表示,(0.0,0.0)点接近图层的原点,而(1.0,1.0)是原点的对角点。改变图层的父图层的变换属性(如果存在的话)将会影响到anchorPoint的方向,具体变化取决于父图层坐标系的Y轴。
当你设置图层的frame属性的时候,position会根据锚点(anchorPoint)相应的改变,而当你设置图层的position属性的时候,bounds会根据锚点(anchorPoint)做相应的改变。

iOS 注意:以下示例描述基于Mac OS X的图层,它的坐标系原点基于左下角。在iOS上面,图层的坐标系原点位于左上角,原点向下和向右为正值。这变化用具体数值显示,而不是概念描述。

下图描述了基于锚点的三个示例值:

anchorPoint默认值是(0.5,0.5),位于图层边界的中心点(如上图显示),B点把anchorPoint设置为(0.0,0.5)。最后C点(1.0,0.0)把图层的position设置为图层frame的右下角。该图适用于Mac OS X的图层。在iOS系统里面,图层使用不同的坐标系,相应的(0.0,0.0)位于左上角,而(1.0,1.0)位于右下角。

图层的frame、bounds、position和anchorPoint关系如下图所示:

图层原点 :基于(0.5,0.5)

在该示例中,anchorPoint默认值为(0.5,0.5),位于图层的中心点。图层的position值为(100.0,100.0),bounds为(0.0,0.0,120,80.0)。通过计算得到图层的frame为(40.0,60.0,120.0,80.0)。

如果你新创建一个图层,则只有设置图层的frame为(40.0,60.0,120.0,80.0),相应的position属性值将会自动设置为(100.0,100.0),而bounds会自动设置为(0.0,0.0,120.0,80.0)。

下图显示一个图层具有相同的frame(如上图),但是在该图中它的anchorPoint属性值被设置为(0.0,0.0),位于图层的左下角位置。

图层原点 :基于 (0.0,0.0)

图层的frame值同样为(40.0,60.0,120.0,80.0),bounds的值不变,但是图层的position值已经改变为(40.0,60.0)。

图层的几何外形和Cocoa视图另外一个不同地方是,你可以设置图层的一个边角的半径来把图层显示为圆角。图层的cornerRadius属性指定了重绘图层内容,剪切子图层,绘制图层的边界和阴影的时候时候圆角的半径。

图层的zPosition属性值指定了该图层位于Z轴上面位置,zPosition用于设置图层相对于图层的同级图层的可视位置。

这个知识点还是比较重要的,因为动画位置设置可能会需要。后面的显示动画、隐式动画、图层内容、图层Action等等后面学到在总结吧。