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. Ubuntu 安装JDK步骤 ,提示没有那个文件或目录

    作为一个程序员,配置环境是最基本的功夫,然而我却捣鼓了一下午,包括安装Ubuntu,安装JDK和配置环境变量. 简单记录下自己的安装过程: 1  下载JDK tar包,使用tar -xzvf jdk* ...

  2. android: 使用 IntentService

    9.5.2 使用 IntentService 话说回来,在本章一开始的时候我们就已经知道,服务中的代码都是默认运行在主线程 当中的,如果直接在服务里去处理一些耗时的逻辑,就很容易出现 ANR(Appl ...

  3. WPF应用程序最小化到系统托盘

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows; u ...

  4. 七牛CEO许式伟:移动游戏资源存贮的大趋势

    (国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) 9月14日,eoe移动开发者大会正式在北京国家会议中心召开,七牛云储存CEO许式伟先生做了 ...

  5. Uploadify v3.2.1 上传图片并预览

    前端JSP: <script type="text/javascript"> $(function() { $("#upload_org_code" ...

  6. windbg-bp、 bm、 bu、 bl、 bc、 ba(断点、硬件断点)

    bp bp 命令是在某个地址下断点, 可以 bp 0x7783FEB 也可以 bp MyApp!SomeFunction . 对于后者,WinDBG 会自动找到MyApp!SomeFunction 对 ...

  7. mediawiki的管理与使用

    本文主要讲述搭建好私有的mediawiki之后,管理员可能需要用到的几个功能.   维基百科的设计思路与我以往使用的系统不太一样,以管理员模式进入之后,并没有我预想的添加wiki页面入口,和侧边栏导航 ...

  8. 搭建mongodb集群(副本集+分片)

    搭建mongodb集群(副本集+分片) 转载自:http://blog.csdn.net/bluejoe2000/article/details/41323051 完整的搭建mongodb集群(副本集 ...

  9. LeetCode: Unique Paths II 解题报告

    Unique Paths II Total Accepted: 31019 Total Submissions: 110866My Submissions Question Solution  Fol ...

  10. 【linux】——FreeBSD 建立 SSH 连接慢的解决方法

    一般在编写 linux 程序的时候,会使用 SecureCRT 或者 xshell 等工具远程登录到 linux 服务器上.最近发现在建立 SSH 连接的时候,非常慢,但是建立连接成功之后可以正常使用 ...