Core Animation (一)

Core Animation

**Core Animation**是iOS和OS x 系统中图形渲染和动画的基础引擎,可以用他来给app的视图及其他的可见元素增加动画效果。当使用**Core Animation**产生动画时,**Core Animation**会帮你绘制动画所需要的每一帧,而你要做的只是指定几个动画参数(比如开始和结束的位置)和通知**Core Animation**开始。此时**Core Animation**会使用相应的图形硬件进行快速渲染。这个自动的图形加速渲染会产生高帧率和流畅的动画而不增加cpu的负荷及减缓app的运行速度。

其实**Core Animation** 不只是可以用来做动画,动画只是它作用的冰山一角。**Core Animation ** 是一个复合的引擎 。它的职责就是尽快组合屏幕上不同的可视内容,这些内容是被分解成独立的图层存储在一个叫图层树的体系之中。

layer Core Animation 的基础

------------------------------------

在iOS当中,所有的视图都从一个叫做UIVIew的基类派生而来,UIView可以处理触摸事件,可以支持基于Core Graphics绘图,可以做仿射变换(例如旋转或者缩放),或者简单的类似于滑动或者渐变的动画。

Layer  ,图层与UIView 类似。也是一些被层级关系管理的矩形块。同样也可以包含一些内容,管理子图层,做动画和变化。但是,图层对象不能处理用处理用户交互,这也它与UIView最大的不同。

每一个视图都有自己的图层对象。也就是Backing layer. 图层会把View的内容捕获被存储在一张bitmap中以便使用硬件来进行相应的操作。通常Layer 被用来当作管理相应View内容的一种方式(当然你可以根据需要创建独立的Layer对象).而视图的职责就是创建并管理这个图层,以确保当视图在层级关系中被添加或移除时对应的图层在相应的层级关系中进行相同的操作。

实际上这些背后关联的图层才是真正用来在屏幕上显示和做动画,UIView仅仅是对它的一个封装,提供了一些iOS类似于处理触摸的具体功能,以及Core Animation底层方法的高级接口。

但是为什么iOS要基于UIView和CALayer提供两个平行的层级关系呢?为什么不用一个简单的层级来处理所有事情呢?原因在于要做职责分离,这样也能避免很多重复代码。在iOS和Mac OS两个平台上,事件和用户交互有很多地方的不同,基于多点触控的用户界面和基于鼠标键盘有着本质的区别,这就是为什么iOS有UIKit和UIView,但是Mac OS有AppKit和NSView的原因。他们功能上很相似,但是在实现上有着显著的区别。我们可以把用一个小范围的mv模式来理解。Layer
就是一个DataObject,当View发生属性数据的改变时会通知Layer去做相应的改变并显示,自己只处理与用户的交互。

视图可以响应事件图层不能响应,但在内容处理方面,图层有更多的View不具备的功能。

1. 边框(borer) ,圆角(Corner),阴影(shadow)

2. 3D变换

3. 非矩形区域

4. 透明遮罩

5. 多级非线性动画。

这些会慢慢解释。

视图与图层的几何属性

----------------------------

当我们改变Layer的一些属性时,改变的只是这个Layer的一些状态信息。当一个改变触发动画时,Layer会把自己缓冲的bitMap跟状态信息交给图形硬件来跟据新的状态信息渲染新的bitmap。图形硬件的渲染速度远远快于软件的渲染速度。下图展示了绘制的过程

由于Layer改变的是一张静态的bitmap,因此大不同于传统的绘制技术。当基于view的改变发生时会调用view的DrawRect: 方法用新的参数重新绘制。但这种绘制是在主线程是发的,并且会消耗cpu。

layer一些可以改变的属性:

简单的可变属性:Frame, bounds,center,position

--------------------------------------------------------

UIView *view = [[UIView alloc] initWithFrame: CGRectMake(10, 10, 40, 50)];

view.backgroundColor = [UIColor redColor];

CALayer *layer = view.layer;

[self.view addSubview:view];

NSLog(@"view‘s frame = %@, view‘s bound = %@ view‘s center = %@",NSStringFromCGRect(view.frame),NSStringFromCGRect(view.bounds),NSStringFromCGPoint(view.center));

NSLog(@"layer‘s frame = %@, layer‘s bound = %@ , layer‘s position = %@",NSStringFromCGRect(layer.frame),NSStringFromCGRect(layer.bounds),NSStringFromCGPoint(layer.position));

结果:view‘s frame = {{10, 10}, {40, 50}}, view‘s bound = {{0, 0}, {40, 50}} view‘s center = {30, 35}

layer‘s frame = {{10, 10}, {40, 50}}, layer‘s bound = {{0, 0}, {40, 50}} , layer‘s position = {30, 35}

从上面的结果我们可以看出,视图跟图层对象都具有frame,跟bound属性。Frame是相对于父视图/图层而言的,是一种相对关系。左上角为(0,0)点。Bound 是相对于自身的属性。表示自己的几何形状。

center是视图的相对于父视图的中心坐标.

positon是图层相对于父图层的中心坐标

时间: 2024-10-29 05:17:15

Core Animation (一)的相关文章

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

第六章:Specialized Layers   类别 用途 CAEmitterLayer 用于实现基于Core Animation粒子发射系统.发射器层对象控制粒子的生成和起源 CAGradientLayer 用于绘制一个颜色渐变填充图层的形状(所有圆角矩形边界内的部分) CAEAGLLayer/CAOpenGLLayer 用于设置需要使用OpenGL ES(iOS)或OpenGL(OS X)绘制的内容与内容储备. CAReplicatorLayer 当你想自动生成一个或多个子层的拷贝.复制器

使用 Core Animation 实现图片的碎片化----

用 Core Animation 实现图片的碎片化 参考书籍: 效果如下: 原理其实非常简单哦:). 1. 创建一个CALayer,使用其 contents 属性来装载一张图片(获取图片的CGImage) 2. 根据frame值裁剪图片,然后将裁剪的图片赋给你创建的更小的CALayer 3. 实现这些更小的CALayer的动画 4. 剩下的该干嘛干嘛,比如使用 Core Image 滤镜什么的,就靠你创造了:) 核心代码: 源码(书中提供,并非本人所写): /*** * Excerpted fr

iOS Core Animation Advanced Techniques(一):图层树、寄宿图以及图层几何学

(一)图层的树状结构 巨妖有图层,洋葱也有图层,你有吗?我们都有图层 -- 史莱克 Core Animation其实是一个令人误解的命名.你可能认为它只是用来做动画的,但实际上它是从一个叫做Layer Kit这么一个不怎么和动画有关的名字演变而来,所以做动画这只是Core Animation特性的冰山一角. Core Animation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做图层树的体系之中.于是这个树形成了UIKit以及在iO

Core Animation 动画效果介绍

在开始之前呢,先了解一下UIView和CALayer大体的区别(重点列举了以下四点): UIView继承自 UIResponder,因此UIView 可以处理响应事件,而CALayer继承自NSObject,所以它只是负责内容的创建,绘制. UIView负责对内容的管理,而CALayer则是对内容的绘制 UIView中有关位置的属性只有frame.bounds.center,而CALayer除了具备这些属性之外还有anchorPoint.position. 通过修改CALayer可以实现UIVi

iOS Core Animation之CALayer心得

使用CALayer的mask实现注水动画效果 Core Animation一直是iOS比较有意思的一个主题,使用Core Animation可以实现非常平滑的炫酷动画.Core animtion的API是较高级的封装,使用便捷,使得我们免于自己使用OpenGL实现动画.本文主要介绍如何使用CALayer的mask实现一个双向注水动画(姑且这么叫吧). 了解CALayer的mask 以上是CALayer的头文件关于mask的说明,mask实际上layer内容的一个遮罩. 如果我们把mask是透明的

iOS Core Animation Advanced Techniques-隐式动画

上六章节: 图层树 图层的寄宿图 图层几何学 图层视觉效果 图层变换 专用图层 这篇随笔主要介绍有关图层隐式动画. 隐式动画: 没有指定任何动画类型,而改变了一个属性,Core Animation决定如何并且何时去做动画. 动画执行的事件取决于当前事务的设置: 动画类型取决于图层行为. Core Animation假设屏幕上任何东西都可能做动画,默认动画效果是打开的. 当CALayer的一个 可做动画的 属性 被改变,默认从先前值平滑过渡到新值,而不是立刻显示新值在屏幕上,因此携带了隐式动画.

iOS Core Animation Advanced Techniques-显式动画

上七章节: 图层树 图层的寄宿图 图层几何学 图层视觉效果 图层变换 专用图层 隐式动画 这篇随笔主要介绍有关图层显式动画. 显示动画: 能对一些属性做指定的自定义动画,或者创建非线性动画 属性动画: 属性动画作用于图层的某个单一属性,并指定了它的一个目标值,或一连串将要做动画的值 属性动画分两种: 1.基础 2.关键帧 基础动画:(通过CALayer的实例方法addAnimation: forKey:给图层添加显示动画) CABasicAnimation-->CAPropertyAnimati

iOS核心动画Core Animation(二)

一. 使用核心动画实现动画效果的步骤 ■1. 创建动画对象 ■2. 设置动画属性 ■3. 把动画对象添加到某个 CALayer 对象上 ■4. 需要停止动画:可以调用 remove 方法移除动画 具体步骤 1.使用它需要先添加QuartzCore.framework框架和引入主头文件<QuartzCore/QuartzCore.h> 2.初始化一个CAAnimation对象,并设置一些动画相关属性 3.通过调用CALayer的addAnimation:forKey:方法增加CAAnimatio

iOS核心动画Core Animation(一)

核心动画Core Animation(一) 一.简述 Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程. 二.核心动画常识 列举处核心动画的一些常识知识. 核心动画的本质:在后台移动图层中的内容,  执行完毕后图层本身的位置并没有发生变化. 如果是Xcode6之前的版本,要导入<QuartzCore/QuartzCore.h>框架,

iOS开发-核心动画(Core Animation)

一.简单介绍 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍. Core Animation是跨平台的,可以用在Mac OS X和iOS平台. Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程. 要注意的是,Core Animation是直接作用在CALayer上的,并非UIView.(CALayer点击此处) 二.Core Animation的使用步骤 初始化一个CAAnimation对象,并设置一些动画