---页首---

CoreAnimation 入门系列 一 基本概念及知识简介

CoreAnimation 简介

* CoreAnimation(后面简称 CA)可就用于 MacOS和iOS上,是用来做图形 渲染和动画的基础。可用于views和其它可视元素。用CA的时候,很多必要的工作如每一帧的动画都已经帮你处理好,你要做的是配置一些参数,如开始和结束的点,然后告诉CA开始吧。CA会做剩下的,图形主版的硬件会加速渲染,这样不会让CPU有更多 的负担,且不会影响到你的应用。

CA 管理着你应用的内容,不仅是绘图,而且是组成和操纵你应用的基础,在这个核心是 layer 对象,你可以用来管理和操作你的内容。layer经常以位图的方式捕获你的内容,这样图形硬件会更容易的操作。如果需要你也可以创建一个独立的layer
CA创建的大部分的动画都是通过修改layer 的属性。如 view、layer对象都有属性bounds、position、opacity、transform等其它可视化的属性。在你修改这些属性的时候都会有隐式的动画,当然也可以显示的赋于动画
layer也是以层级的方式来管理,可以像我们熟悉的view一样有父子的关系,大多数情况下与view的操作相同
Actions可以改变layer默认的行为,用 action对象获得的隐式动画,是通过通用对象实现预定义的接口实现。可以创建自己的action对象实现自定义的动画或其它类型的行为,然后将action对象赋给layer的属性,当属性改变时,CA获得对象并通知去执行。

CoreAniamation 基本架构 - ca_architecture

图层为绘图和动画提供基础

* 图层对象是在3D空间中展示的2D平面,也是做一切动画的核心。图层管理平面上的几何、内容、可视属性等信息。图层并不定义自己的外观,它只管理位图状态信息。出于这个原因,主要图层在应用中主要是管理数据,因此被认为是模型对象。这个概念很重要,它影响动画的行为。

基于图层的绘图模型

* 大多数层在你的应用程序中不做任何实际的绘制。相反,一个层捕获你的应用程序提供的内容,并将其以位图的形式缓存,被称为备份存储。
* 当改变图层的属性触发动画,CA传递图层的位置及状态信息给绘图硬件,将用新的信息渲染位图,且比软件操作要更快.
* 基于图层的绘图与更传统的基于视图的绘图技术有很大不同,因为操作的是静态的位图。基于视图的绘图会调用`drawRect:`方法重新绘制内容,这种
消耗很大,因为是在主线程CPU来完成工作的,CA则避免了这种消耗,直接在硬件中操作缓存的位图来达到同样或相似的效果

基于图层的绘图模型 basics_layer_rendering

基于图层的动画

* 图层的数据和状态信息从屏幕视觉呈现的图层中分离出来,这种解耦为CA自身插入和动画从旧值到新值提供了一种方法
* 在动画过程中,CA为你用硬件一帧一帧绘制,你所需做的就是指定动画开始和结束的值。当然也可以自定义时间信息和动画参数,如果不提供,CA会提供合适的默认值

基于图层的动画 basics_animation_types

图层对象定义自己的几何信息

* 管理图层的几何信息是图层的工作之一,视觉几何信息包括:内容的bounds、position、rotate、scale、transform等,图层的frame\bounds可以定位位置和内容。图层也具备视图没有的属性,如锚点(定义了一些点的操作),指定图层的几何信息还有其它方面的也与视图不相同

图层对象的默认几何坐标 layer_coords_bounds
iOS&Mac OS 单位坐标 layer_coords_unit
锚点与几何坐标的关系01 layer_coords_anchorpoint_position
锚点与几何坐标的关系02 layer_coords_anchorpoint_transform

图层使用两种类型的坐标系统

* 图层使用基于点和单位坐标两种坐标系统来指定内容的位置,使用哪种类型的系统要根据传达信息类型的不同而不同。基于点的通常用来指定值相对于屏幕
或者指定相对另一个图层,例如属性 position就是基于点坐标的。
* 当值不应该与屏幕发生关联时,只相对于其它某个值时使用单位坐标系,例如属性`anchorPoint`,指定一个值相对于图层自身`bounds`
* 基于点的坐标系统主要是对图层的`bounds`、`position`属性。图层也有`frame`属性,是从前面两个属性派生出来的,很少用。
* 图层的`bounds`、`frame`的方向通常与底层平台一致,iOS的原点在左上角,MacOS的原点在左下角

图层可以从三个维度操作

* 每个图层有两个变换矩阵来操作图层和它的内容,用 `transform` 属性,可以改变自身和内含的子图层。例如用这个属性scale\rotate或暂时改变position
* sublayerTransform属性定义仅适用于子层的其他转换,并且最常用于向场景内容添加透视视觉效果。
* 原始坐标系的点可以通过与一个 4*4 阶的矩阵相乘得到变换后的坐标点
* 当然不用直接改变矩阵中的值,CA提供了一套完整的函数集,用于创建缩放、平移和旋转矩阵,以及进行矩阵比较。`CATransform3D Key Paths`

图层与坐标变换的矩阵关系式01 transform_basic_math
图层与坐标变换的矩阵关系式02 transform_manipulations

图层树反映不同动画状态的方面

* 应用使用CA有三组图层对象,每组图层对象在显示内容到屏幕上扮演的角色不同:
* 图层模型树(或称图层树)是应用交互最多的,对象在此树中存储动画的目标值,当改变图层的属性,使用这些对象中的一个
* 表现层树包含任一正在运行动画的值,此树中的对象你不能修改。但你可以用这些对象去读取当前动画的值,可利用这些值作为一个动画的起始。
* 渲染树执行实际的动画且是CA所私有的
* 当然图层组织的层级结构如视图类似,实际上,图层的初始结构与视图的初始结构相一致,有时你可以使用图层代替视图减少消耗。
* 对于图层树中的每个对象会匹配表现层树和渲染层树中的一个对象,应用主要工作的对象是图层中,但也可能通过`presentationLayer`属性访问
表现层树中的对象

窗口与图层的关系01 sublayer_hierarchy
窗口与图层的关系02 sublayer_hierarchies

图层与视图的关系

* 图层是视图的基础结构,但不能仅基于图层创建可视界面
* 图层的绘制及动画的更容易,效率也更高
* 图层不能响应事件、绘制内容、参与响应链等,所以应用中视图必不可少
* iOS中视图都有一个相应的图层对象支持, OS X 中必须指定视图拥有哪些图层,OS X 10.8及以上通常给所有的视图添加图层,但这不是强制。
* 图层通常会增加内存开销,但它的好处通常大于缺点
* 启用图层支持的视图,系统负责创建图层对象并保持同步
* OS X 中可以采用图层托管的方式,用 AppKit 来根据不同的视图对其管理
posted @ 2020-01-05 16:15  20190311  阅读(282)  评论(0编辑  收藏  举报
---页脚---