CoreAnimation 文档学习笔记01

CoreAnimation 笔记01

1. CA 基础

核心动画提供了一个通用的系统,用于动画应用程序的视图和其他视觉元素。核心动画并不能取代应用程序的视图。相反,它是一种与视图集成的技术,以提供更好的性能和动画内容的支持。它通过将视图contents缓存到可以由图形硬件直接操作的bitmaps来实现这种行为。在某些情况下,这种缓存行为可能需要您重新思考如何呈现和管理应用程序的内容,但大多数时候您使用核心动画而不知道它的存在。除了缓存视图内容外,核心动画还定义了一种指定任意视觉内容的方法,将内容与视图集成,并将动画与其他内容一起动画化。
使用核心动画来激活应用程序的视图和可视对象的更改。大多数更改涉及修改视觉对象的属性。例如,您可以使用核心动画来对视图的位置、大小或不透明度进行动画更改。当你做出这样的改变时,核心动画在属性的当前值和你指定的新值之间动画。一般情况下,你不会使用核心动画来代替60秒钟的视图内容,例如在卡通中。相反,您可以使用核心动画来移动视图的内容,在屏幕上移动内容,将内容淡入或淡出,向视图应用任意图形转换,或者更改视图的其他视觉属性。

layers 提供了绘制和动画的基础

layer对象是在三维空间中组织的2D表面,是核心动画所做的一切的核心。像view一样,layer管理关于它们表面的几何、内容和视觉属性的信息。不同于view,layer不定义它们自己的外观。一layer仅管bitmpa周围的状态信息。view本身可以是视图绘制本身或指定的固定图像的结果。由于这个原因,在应用程序中使用的主要层被认为是模型对象,因为它们主要管理数据。这个概念很重要,因为它影响动画的行为.

  1. layer-based 绘制模型
    layer在应用程序中不做任何实际的绘图。取而代之的是,一个layer捕获你的应用程序提供的内容,并在bitmap中缓存它,有时称为backing-store。当您随后更改该layer的属性时,您所做的只是更改与layer对象相关联的状态信息。当改变触发动画时,核心动画将layer的bitmap和状态信息传递给图形硬件,图形硬件使用新信息来绘制bitmap,如图1-1所示。在硬件中操作bitmap会产生比在软件中更快的动画.
    因为它操纵静态bitmap,基于layer的绘制与传统的基于vuew的绘制技术有很大区别。使用基于view的绘图时,view本身的更改通常会导致调用view的drawRect:方法使用新参数重新绘制内容。但是以这种方式绘制是昂贵的,因为它是在主线程上使用CPU完成的。核心动画通过在硬件中操作缓存的bitmap来实现相同或相似的效果,尽可能避免这种开销。
    虽然核心动画尽可能多地使用缓存内容,但您的应用程序仍然必须提供初始内容并不时更新。应用程序有几种方法来提供具有内容的层对象,这些内容在提供层内容时被详细描述.
  2. layer-based 动画
    layer对象的数据和状态信息与屏幕上的该layer内容的可视表示形式是分离的。这种解耦为核心动画提供了一种干预自身的方法, 并将从旧状态值到新状态值的更改进行动画处理。例如, 更改layer的位置属性会导致核心动画将layer从其当前位置移动到新指定的位置。对其他属性的类似更改会导致相应的动画。图1-2 演示了可以在图层上执行的几个动画类型。有关触发动画的图层属性的列表
    [image:28165EB8-F5CF-4F53-BDFA-37D7062410B9-90694-0001413F3CC1FB8A/39D6A979-275B-4D72-962D-C9F32E22A9F6.png]
    在动画的过程中,核心动画在硬件里为你做了一个一帧一帧的绘制。你所要做的就是指定动画的开始和结束点,让核心动画做剩下的。您还可以根据需要指定定制的时序信息和动画参数;然而,如果不执行,则核心动画提供适当的默认值。

1. Layer 可以三维变换

每个 Layer 有两个 transfrom 属性, transform 和 subLayerTransform
transfrom 可以对 layer 和 里面的 sublayers 都进行处理
subLayerTransform 只对 sublayers, 经常用来做透视变换的..

layer transform的本质 是使用一个4*4 矩阵 与 坐标相乘.

2. 不同的图层树反应动画的不同状态

就是说有每个 layer 本质上有三个 layer 对应着
model layer 就是 app 里面与代码交互的
presentation layer 是动画过程中看得到的 layer,
render layer 是进行实际渲染的 layer. 私有的.

3. layer 和 view 的关系

layer 不能替代 UIViiew ,不能创建一个全部都是用 layer app, 因为 layer 只是为 view 提供一些底层支持..单独使用 layer 的好处是提高绘制和动画性能效率高帧率. layer 不能做的 处理事件,绘制内容,参与响应链条.

iOS 上所有的 view 都有 layer, mac 系统大部分有,有的没有.

另外, 可以创建单独的 layer 添加到任何其他 layer,view 的 layer 也不例外. 单独使用 layer 是优化性能的一种办法, 比如 在很多地方使用同样一张图片, 可以使用 layer ,创建多个 layer 添加到 layer 树种.这些 layer 会使用同样一张图片,而不会创建多个图片副本.

2. 设置 layer 对象

  1. layer 是 核心动画的关键, layer管理应用程序的可视内容, 并提供修改该内容的样式和外观的选项.

iOS 上UIVIew 默认都有一个 layer ,一般这个 layer 是 CALayer 类型,但是CoraAnimation 也提供很多其他类型的 layer ,如 CAMetailLayer,,不同类型的 layer 用来更高效的处理不同的应用场景.
+ (Class) layerClass 这个方法实现修改 layer的类型.

CAEmitterLayer
Used to implement a Core Animation–based particle emitter system. The emitter layer object controls the generation of the particles and their origin.
CAGradientLayer
Used to draw a color gradient that fills the shape of the layer (within the bounds of any rounded corners).
CAMetalLayer
Used to set up and vend drawable textures for rendering layer content using Metal.
CAEAGLLayer / CAOpenGLLayer
Used to set up the backing store and context for rendering layer content using OpenGL ES (iOS) or OpenGL (OS X).
CAReplicatorLayer
Used when you want to make copies of one or more sublayers automatically. The replicator makes the copies for you and uses the properties you specify to alter the appearance or attributes of the copies.
CAScrollLayer
Used to manage a large scrollable area composed of multiple sublayers.
CAShapeLayer
Used to draw a cubic Bezier spline. Shape layers are advantageous for drawing path-based shapes because they always result in a crisp path, as opposed to a path you draw into a layer’s backing store, which would not look as good when scaled. However, the crisp results do involve rendering the shape on the main thread and caching the results.
CATextLayer
Used to render a plain or attributed string of text.
CATiledLayer
Used to manage a large image that can be divided into smaller tiles and rendered individually with support for zooming in and out of the content.
CATransformLayer
Used to render a true 3D layer hierarchy, rather than the flattened layer hierarchy implemented by other layer classes.
QCCompositionLayer
Used to render a Quartz Composer composition. (OS X only)

  1. 给 layer 设置 content

layer是管理应用程序提供的content的数据对象。layer的content由包含要显示的可视数据的bitmap组成。
设置 content的三种方式

  • 1.直接设置 image, 应对很少变化的场景
  • 2.使用 delegate. 让 delegate 去设置,
  • 3.自定义 layer 的子类,重写它的绘制方法. 可以改变layer 的基本绘制行为

如果app都是 layer-backed view ,那就不需要关心这些了, view 会自动给 layer 设置 content.
下面详细讲讲上面的三种方式

  1. 直接设置 image
    因为 layer 只是一个管理 bitmap 的容器,所有可以直接设置 image 到 content.s 属性. 而且 layer 会直接使用你设置的 image, 不会去创建副本, 节省内存.需要注意的就是分辨率问题,.

  2. 使用 delegate
    如果要动态的改变 content, 使用 delegate. 要展示的时候 layer’ 会调用代理的
    displayLayer:drawLayer:inContext:, 先后调用,前面方法没有实现才会调用后面方法. 前面的方法你需要创建 bitmap 并设置给 layer 的 contents 属性.后面的方法 CoreAnimation 会创建 bitmap, 创建图形上下文,然后调用这个方法去填充到 bitmap 中.
    iOS 的 view ,会自动实现这些方法, 只需要实现 drawRect:方法 就行了.因为drawLayer:inContext: 默认会调用drawRect:方法.

  3. 子类 layer

同上 ,需要 重写 display 或者drawInContext:方法.同样只会执行一个.
diaplay方法是更新 contents 的主要入口,能完全掌控过程.
如果只想绘制内容,实现第二个 方法,让 layer 创建 backing store .

3.对设置 contents 调整

主要是 contentsGravity 这个属性,的设置会影响 contents 的展示.因为 设置 contents 的内容为 image, image 的大小和 layer 的 bounds 大小不一致的时候 ,如何调整 contents 内容的. 主要分两类:

  1. 一类是 就是把 image 固定在 layer 矩形的边缘或者角落.不会拉伸 image
  2. 一类就是拉伸 image

4. 对高分辨率的出来

layer 不了解底层设置的分辨率.一层简单地存储一个指向位图的指针,并以可用的像素显示它的最佳方式。 所有 如何直接设置 contents 的话,还需要告诉 layer contentsScale 应该设置为多少合适. iOS layer-back view 会自动设置了.

调整 layer 的外观

layer 有自己的 背景和边框.背景在 contents 下面,边框在 contents 上面.
如果设置背景色不透明, 需要设置layer 的opaque属性为 YES,这样可以提高屏幕混合layer 的性能, layer 的 backing store 也不需要管理alpha 通道了..但是如果 layer 有圆角 ,禁止设置opaque . ::这里为啥?::

layer 支持圆角
通过设置 corner radius 可以创建圆角矩形.原理是应用透明的蒙层.corner radius 不影响 content 属性内容, 除非设置 masktobounds 为 YES. 然而,corner radius 影响 layer 的背景色和边框.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,373评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,732评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,163评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,700评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,036评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,425评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,737评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,421评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,141评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,398评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,908评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,276评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,907评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,018评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,772评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,448评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,325评论 2 261

推荐阅读更多精彩内容

  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 4,981评论 3 23
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,934评论 3 118
  • 转载:http://www.jianshu.com/p/32fcadd12108 每个UIView有一个伙伴称为l...
    F麦子阅读 5,942评论 0 13
  • 每个UIView有一个伙伴称为layer,一个CALayer。UIView实际上并没有把自己画到屏幕上;它绘制本身...
    shenzhenboy阅读 3,020评论 0 17
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 4,996评论 5 13