参考文档:
https://www.jianshu.com/p/7018e61b6ee5
https://limboy.me/tech/2013/06/08/ios-graphic-animation.html
1、Core Animation
Core Animation 包含于 QuartzCore.framwork 中,是一组自由度更大的图形绘制和动画 API,但实现起来也会比 Core Graphics 麻烦一点。iOS 上的 UIKit 和动画效果大部分都是通过 Core Animation 实现的。
Core Animation 是一个既支持iOS,也支持MAC OS 的动画框架,其执行动画是在后台,不会阻塞主线程,同时其作用在CALayer,不是UIView。实际上它也干 Drawing 的活,这就需要CALayer 的帮助
CAAnimation 继承结构
| - CAAnimation
| - CAPropertyAnimation
| - CABasicAnimation
| - CASpringAnimation
| - CAKeyframeAnimation
| - CATransition
| - CAAnimationGroup
CAAnimation: 核心动画的基础类,不能直接使用,负责动画运行时间、速度的控制,本身实现了CAMediaTiming协议。
CAPropertyAnimation: 属性动画的基类(通过属性进行动画设置,注意是可动画属性),不能直接使用。
CABasicAnimation: 基础动画,通过属性修改进行动画参数控制,只有初始状态和结束状态,可以看作是两个关键帧的 CAKeyframeAnimation。
CASpringAnimation:阻尼动画
CAKeyframeAnimation: 关键帧动画,同样是通过属性进行动画参数控制,但是同基础动画不同的是它可以有多个状态控制。
CATransition: 转场动画,通过滤镜进行动画效果设置,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点,UINavigationController 就是通过CATransition 实现了将控制器的视图推入屏幕的动画效果。。
CAAnimationGroup:动画组,动画组是一种组合模式设计,可以通过组合动画组来进行所有动画行为的统一控制,组中的所有动画效果可以并发执行。
1.1 隐式动画
介绍:
由于 CALayer 在设计之初就考虑它的动画操作功能,CALayer 很多属性在修改时都能形成动画效果,这种属性称为“隐式动画属性”(隐式属性动画的本质是这些属性的变动默认隐含了 CABasicAnimation 动画实现)。
修改属性产生隐式动画:
但是对于 UIView 的根图层(Root CALayer)而言属性的修改并不形成动画效果,因为很多情况下根图层更多的充当容器的做用,如果它的属性变动形成动画效果会直接影响子图层。
对于非根图层,设置图层的可动画(Animatable)属性(在动画结束后重新设置了 position,而 position 是可动画属性)会产生默认的隐式动画。解决这个问题有两种办法:关闭图层隐式动画、设置动画图层为根图层。
关闭隐式动画:
要关闭隐式动画需要用到动画事务 CATransaction:
CATransaction 是 Core Animation 里负责协调多个动画更新显示操作,保证多个动画同时进行,用于配置隐式动画,即 CALayer 属性修改依赖 CATransaction.
和动画类似 CATransaction 也分为隐式事务和显式事务
隐式事务:在某次 RunLoop 中设置了一个“Animatable”属性,如果当前没有设置事务,则会自动创建一个CATransaction,并在当前线程的下一个 RunLoop 中 commit 这个 CATransaction
显式事务:直接调用 CATransaction 的 [CATransaction begin],[CATransaction commit] 等相关方法。
另外事务可以嵌套,当事务嵌套时候,只有最外层的事务 commit 了之后,整个动画才会执行。
在事务内将隐式动画关闭:
1.2 显式动画
显式动画需要在代码中使用 Core Animation 创建一个动画对象,并设置开始和结束值,直到把动画应用到某图层上,进而开始执行的动画。
几种常用的 Layer:
CAEmitterLayer:是CoreAnimation框架中的粒子发射层,可以做出火焰等效果。
CAGradientLayer:是用于色彩梯度展示的layer图层,通过CAGradientLayer,我们可以很轻松的创建出有过渡效果的色彩图
CAReplocatorLayer:是拷贝视图容器,我们可以通过它,将其中的子layer进行拷贝,并进行一些差异处理
CAShapeLayer:是图形layer层,我们可以自定义这个层的形状
CATextLayer:可以进行文本的绘制
CALayer 层级:
1、图层树:包含每一层的对象模型值。他们就是你设定的图层的属性值
2、呈现树:包含了当前动画发生时候将要显示的值(例如你要给图层背景颜色设置新的值的时候,它会立即修改图层树里面相应的值。但是在呈现树里面背景颜色值在将要显示给用户的时候才被更新为新值)
3、渲染树:在渲染图层的时候使用呈现树的值 (渲染树负责执行独立于应用活动的复杂操作。渲染由一个单独的进程或线程来执行,使其对应用程序的运行循环影响最小)
2、Core Graphics
Core Graphics 是一组用来绘制 2D 图形的 API,使用 CPU 进行计算。 新建一个项目时,模板已经自动载入了 CoreGraphics.framwork 。
它是 iOS 的核心图形库,包含 Quartz2D 绘图 API 接口, 常用的是 point,size,rect 等这些图形,都定义在这个框架中,类名以 CG 开头的都属于 CoreGraphics 框架,它提供的都是 C 语言函数接口,是可以在 iOS 和 mac OS 通用的。
并且 CoreAnimation 中大量使用到 CoreGraphics 中的类,因为实现动画要用到图形库中的定义的属性。
3、QuartzCore
QuartzCore 是位于 Mac OS X 的 Drawin 核心之上的绘图层(包含CoreAnimation),是 iOS 系统的基本渲染框架,基于 CoreGraphics 的 OC 语言封装,封装出了基本渲染类 CALayer。
QuartzCore 在 iPhone OS 上的 framework为:
附:
iOS 与图形图像处理相关的框架
1)界面图形框架-- UIKit
2)核心动画框架-- Core Animation
3)苹果封装的图形框架-- Core Graphics & Quartz 2D
4)传统跨平台图形框架-- OpenGL ES
5)苹果最新力推的图形框架 -- Metal
6)用于图像、视频处理的API,如添加滤镜之类的。-- Core Image
7)适合视频的第三方滤镜方案-- GPUImage
8)游戏引擎-- Scene Kit(3D)和Sprite Kit(2D)
9)计算机视觉在iOS的应用-- OpenCV for iOS
各个框架之间的关系:
图像渲染流程:
网友评论