iOS Core Animation 动画 入门学习(一)基础

  reference:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40004514

  在iOS中,每个view中都自动配置了一个layer,我们不能人为新建,而在Mac OS中,view默认是没有layer的,需要手动设置是否开启layer(10.8以后默认是开启状态),因为开启layer是需要一定代价的,那就是需要开销额外的内存。

  view负责显示的内容,而layer负责显示内容的几何特性,在屏幕上的位置,是否被旋转、缩放,透明度等变化。

  和view一样,layer也有frame和bounds两个属性,但我们无法人为的改变frame的值,frame是由position和bounds两个属性决定的。bounds很好理解,一宽一高,决定了自己的大小。而position是相对于父视图的位子坐标。需要注意的是,到底是哪个点相对于父视图的坐标呢?这里我们需要先了解一个属性的概念:anchorPoint(锚点)。它是一个单位向量,x,y都是一个[0.0,1.0]的float值,用来表示position相对于自身宽高的比重,默认值是(0.5,0.5),即在layer的中心点。

  看一个例子,我们就很容易理解position,bounds,anchorPoint的关系了。(iOS的坐标系是左上为原点,OS X则是左下为原点的,这里主要说iOS)

  

  这也anchorPoint究竟有什么用呢?在静止的时候我们还真看不出来,anchorPoint不同对整个layer有什么影响,我们再来看看另一张图:

  

  哈哈,顾名思义,锚点就是固定点的意思嘛,如果执行旋转的话,就是绕着锚点转呗。当然,如果移动位置的话,也是相当于拉着这个锚点在动。

  position和anchorPoint其实是一个点,只不过position是个Point,而anchorPoint是个向量。所以position+anchorPoint+bounds就能确定一个Layer。

  想学动画,光在平面上动来动去,转来转去也没啥意思啊,Layer还支持3D动画(其实个人感觉应该叫伪3D,哈哈)。

  这里我们先要来了解一个属性,transform(变化矩阵)。每个layer有两个transform,transform&sublayerTransform。transform同时对layer和它的sublayer起效,用来执行缩放,旋转,移动等动画。sublayerTransform顾名思义只是针对sublayer的变化,通常用来给它的展示内容添加透视效果。

  tranform实际上是一个4x4的矩阵,如图:

  

  数学好的同学们应该一看就知道什么意思,不过好在我们几本不用直接操作这个矩阵,用设置键值对的方式就可以完成几本的矩阵变化,参考 CATransform3D Key Paths

  看看下面的demo,我们就可以大概了解矩阵里每个值代表什么含义了。

  

  identity是默认情况下的单位矩阵,没有任何变化。

  translate是平移矩阵,变化后为[x+tx, y+ty, z+tz, 1]。

  scale是缩放矩阵,变化后为[x.tx, y.ty, z.tz, 1]。

  后面三个分布是以x轴,y轴,z轴为轴,旋转角度θ,以以x轴旋转为例,变化后为[x, y.cosθ+z.sinθ, -y.sinθ+z.cosθ, 1]。

  刚开始的时候可能比较晕,没关系,iOS系统给我们提供了专门执行这些常用变化的函数,参考Animation Function Reference

  layer跟view一样,用树形结构来组织,Core Animation的App用3套layer对象来控制在屏幕上动态显示的内容。

  model layer tree:简称layer tree,就是我们印象中的layer的模型,这里面存储了所以的变化信息,当你修改layer的属性时,就有用到这里的对象。

  presentation tree:动态树,用来存储layer在屏幕上执行动画的某时刻的值,不能修改它的值,可以用它的值来判断是否要开启新的动画,或者判断碰撞等。

  render tree:渲染树,提供真是的动画,对Core Animation是不可修改的。

  每套layer对象的树形结构都跟view的树形结构完全吻合,每个view都会有layer对象与之对应。但是有点跟view tree不太一样的地方是,layer的树形结构中可以加入额外的layer对象,我们可以在不影响view开销的情况下,加入额外的layer对象来优化view的动态效果。

  注意:presentation tree只能在动画执行的过程中读取,不像layer tree那样,读取时总是反应了layer动画的最终状态。

  本次总结主要是对Layer的理解,大家是否对frame,bounds,position,anchorPoint,transform等属性,还有layer的三种树形结构有了更深的认识了呢?新手们大家一起学习进步,同时也欢迎大师们批评指正

转 iOS Core Animation 动画 入门学习(一)基础的更多相关文章

  1. iOS Core Animation 动画 入门学习(一)基础

    reference:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide ...

  2. iOS - Core Animation 核心动画

    1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...

  3. iOS Core Animation 简明系列教程

    iOS Core Animation 简明系列教程  看到无数的CA教程,都非常的难懂,各种事务各种图层关系看的人头大.自己就想用通俗的语言翻译给大家听,尽可能准确表达,如果哪里有问题,请您指出我会尽 ...

  4. IOS Core Animation Advanced Techniques的学习笔记(五)

    第六章:Specialized Layers   类别 用途 CAEmitterLayer 用于实现基于Core Animation粒子发射系统.发射器层对象控制粒子的生成和起源 CAGradient ...

  5. IOS Core Animation Advanced Techniques的学习笔记(一)

    转载. Book Description Publication Date: August 12, 2013 Core Animation is the technology underlying A ...

  6. IOS Core Animation Advanced Techniques的学习笔记(四)

    第五章:Transforms   Affine Transforms   CGAffineTransform是二维的     Creating a CGAffineTransform   主要有三种变 ...

  7. iOS Instruments之Core Animation动画性能调优(工具复选框选项介绍)

    Core Animation工具用来监测Core Animation性能.它给我们提供了周期性的FPS,并且考虑到了发生在程序之外的动画(见图12.4) Core Animation工具提供了一系列复 ...

  8. iOS Core Animation学习总结(1)--CALayer常用属性

    图层是core animation的基础, UIView之所以能显示在屏幕上,靠的是其内部的这个图层,即每个UIView 都有 CALayer,可通过UIView.layer或者[UIView lay ...

  9. iOS Core Animation之CALayer心得

    使用CALayer的mask实现注水动画效果 Core Animation一直是iOS比较有意思的一个主题,使用Core Animation可以实现非常平滑的炫酷动画.Core animtion的AP ...

随机推荐

  1. Leetcode 107 Binary Tree Level Order Traversal II 二叉树+BFS

    题意是倒过来层次遍历二叉树 下面我介绍下BFS的基本框架,所有的BFS都是这样写的 struct Nodetype { int d;//层数即遍历深度 KeyType m;//相应的节点值 } que ...

  2. Java thread jargon

    In Java thread topic, the task to be executed and the thread to drive the task are two concepts shou ...

  3. css之入门篇

    今日学习终于到了css,css可以实现很多表现出很酷的界面,而css的出现是为了解决 HTML结构上写样式出现一片混乱现象而应运而生的语言,在以前样式都是和结构一起写的, 不分彼此,而这样大大增加了代 ...

  4. HTML5之语义化标签

    HTML 5的革新之一:语义化标签一节元素标签. 在HTML 5出来之前,我们用div来表示页面章节,但是这些div都没有实际意义.(即使我们用css样式的id和class形容这块内容的意义).这些标 ...

  5. Could not find a storyboard named 'Main' in bundle NSBundle

    转自:http://www.cnblogs.com/ygm900/p/3836580.html 1.删掉工程中main.storyboard 后要删除plist文件中对应的键值,否则会报如下错误: C ...

  6. cocos2d-x在Android平台下的音频导致的卡死

      先挖个坑,慢慢再来填.出错信息: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:779: pthread 0x75f14a00 ...

  7. java综合

    java环境变量配置:http://jingyan.baidu.com/article/f96699bb8b38e0894e3c1bef.html 1.导入项目 当下载了包含Eclipse 项目的源代 ...

  8. Windows共享内存示例

    共享内存主要是通过映射机制实现的. Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠的.所谓的重叠是指同一块内存区域可能被多个进程同时使用.当调用 CreateFileMapp ...

  9. C#控制其它程序

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]        ...

  10. [转]如果我有jQuery背景,我应该如何切换到AngularJS的思维模式?

    导言 stackoverflow上有一个人问了一个问题:如果我有jQuery背景,我应该如何切换到AngularJS的思维模式? 有一个回复非常经典,获得了两千多票. 为了让国内开发者也能领略到其中的 ...