核心动画(Core Animation)spring
1、Core animation简单介绍数组
1.Core Animation,中文翻译为核心动画,是一套包含图形绘制,投影,动画的Objective–C类集合。它是一组很是强大的动画处理API,使用它能作出很是炫丽的动画效果,并且每每是事半功倍。也就是说,使用少许的代码就能够实现很是强大的功能。Core Animation自身并非一个绘图系统。它只是一个负责在硬件上合成和操纵应用内容的基础构件缓存
2.Core Animation是跨平台的,能够用在Mac OS X和iOS平台。框架
3.Core Animation负责全部的滚动、旋转、缩小和放大以及全部的iOS动画效果。其中UIKit类一般都有animated:参数部分,它能够容许是否使用动画。函数
4.Core Animation的动画执行过程都是在后台操做的,不会阻塞主线程。不阻塞主线程,能够理解为在执行动画的时候还能点击(按钮)。用图形处理硬件操纵位图要比图形处理软件能得到更好的动画效果。由于操纵的是静态的位图,基于图层的绘图和基于视图的绘图在技术上有明显的不一样。对基于视图的绘图,对视图的改变常常会触发调用视图的drawRect:方法以重绘视图内容。可是此种方式的代价相对较高,由于它是CPU在主线程上的操做。Core Animation经过尽量的使用图形硬件操纵缓存后的位图来避免了这种开销,从而完成相同或类似的效果。布局
5.Core Animation还与Quartz紧密结合在一块儿,每一个UIView都关联到一个CALayer对象,CALayer是Core Animation中的图层。要注意的是,Core Animation是直接做用在CALayer上的,并不是UIView。学习
见图解-01-iOS图形层关系动画
2、Core animation类atom
核心动画类有如下分类:spa
1.提供显示内容的图层类。CALayer(下面会着重介绍)
2.动画和计时类。(Animation and Timing Classes)
3.布局和约束类。(CAConstraint)
4.事务类,在原子更新的时候组合图层类。核心动画的基础类包含在 Quartz 核心框架(Quartz Core framework)里面,虽然它的其余图层类在其余框架里面定义。(CATransaction)
详细说明:
2.1 图层类(Layer Classes)
Layer Classes是core animation的基础。Layer Classes提供了一个抽象的概念,这个概念对于那些使用NSview和UIview的开发者来讲是很熟悉的。基础层是由CAlayer类提供的,CAlayer是全部Core Animation层的父类。
2.2 动画和计时类(Animation and Timing Classes)
图层的不少可视化属性是能够隐式动画的。经过简单的改变图层的可动画显示的属性,可让图层现有属性从当前值动画渐变到新的属性值。例如设置图层的 hidden 属性为 YES 将会触发动画使层逐渐淡出。
2.3 布局管理器类
Application Kit 的视图类相对于 superlayer 提供了经典的“struts and springs”定位 模型。图层类兼容这个模型,同时 Mac OS X 上面的核心动画提供了一套更加灵活 的布局管理机制,它容许开发者本身修改布局管理器。核心动画的 CAConstraint 类 是一个布局管理器,它能够指定子图层类限制于你指定的约束集合。每一个约束 (CAConstraint 类的实例封装)描述层的几何属性(左,右,顶部或底部的边缘或水 平或垂直中心)的关系,关系到其同级之一的几何属性层或 superlayer。通用的布局管理器和约束性布局管理器将会在“布局核心动画的图层”部分讨论。
2.4 事务管理类
图层的动画属性的每个修改必然是事务的一个部分。CATransaction 是核心动画里面负责协调多个动画原子更新显示操做。事务支持嵌套使用。
见图解-02-核心动画的类层次结构
着重了解前两个
3、CALayer简介
Core Animation建立动画时候会修改CALayer属性,而后让这些属性流畅地变化。Core Animation相关知识点:图层,图层是动画发生的地方,CALayer老是与UIView关联,经过layer属性访问。CAlayer是全部Core Animation层的父类。
1.CALayer是什么
在iOS中,你能看得见摸得着的东西基本上都是UIView,好比一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。
其实UIView之因此能显示在屏幕上,彻底是由于它内部的一个图层,在建立UIView对象时,UIView内部会自动建立一个图层(即CALayer对象),经过UIView的layer属性能够访问这个层
@property(nonatomic,readonly,retain) CALayer *layer;
当UIView须要显示到屏幕上时,会调用drawRect:方法进行绘图,而且会将全部内容绘制在本身的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,因而就完成了UIView的显示。
换句话说,UIView自己不具有显示的功能,拥有显示功能的是它内部的图层。
UIView之因此可以显示,彻底是由于内部的CALayer对象。所以,经过操做这个CALayer对象,能够很方便地调整UIView的一些界面属性,好比:阴影、圆角大小、边框宽度和颜色等。
CALayer是个与UIView很相似的概念,一样有layer,sublayer...,一样有backgroundColor、frame等类似的属性,咱们能够将UIView看作一种特殊的CALayer,只不过UIView能够响应事件而已。
通常来讲,layer能够有两种用途,两者不互相冲突:一是对view相关属性的设置,包括圆角、阴影、边框等参数;二是实现对view的动画操控。所以对一个view进行core animation动画,本质上是对该view的.layer进行动画操纵。
2.为何说 CALayer 很重要
(1). 每一个UIView 都有 CALayer,即 UIView.layer,同时 UIView是iOS系统中界面元素的基础,全部的界面元素都是继承自它,因此,CALayer 应用很普遍
(2). CALayer 可以对 UIView 作许多设定,如:阴影、边框、圆角和透明效果等,且这些设定都是颇有用的
3.CAlayer层的属性
(1)、position和anchorPoint
CALayer有2个很是重要的属性:position和anchorPoint
@property CGPoint position;
用来设置CALayer在父层中的位置
以父层的左上角为原点(0, 0)
@property CGPoint anchorPoint;
称为“定位点”、“锚点”
决定着CALayer身上的哪一个点会在position属性所指的位置
以本身的左上角为原点(0, 0)
它的x、y取值范围都是0~1,默认值为(0.5, 0.5)
(2)、隐式动画
每个UIView内部都默认关联着一个CALayer,咱们可用称这个Layer为Root Layer(根层)
全部的非Root Layer,也就是手动建立的CALayer对象,都存在着隐式动画
什么是隐式动画?
当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果
而这些属性称为Animatable Properties(可动画属性)
列举几个常见的Animatable Properties:
bounds:用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画
backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变更画
position:用于设置CALayer的位置。修改这个属性会产平生移动画
4、CAAnimation(动画类)
CAAnimation是全部动画类的父类,可是它不能直接使用,应该使用它的子类。
见图解-03-CAAnimation类的继承结构图
常见属性有:
duration:动画的持续时间
repeatCount:动画的重复次数
timingFunction:控制动画运行的节奏
类的说明:
(1)能用的动画类只有4个子类:CABasicAnimation、CAKeyframeAnimation、CATransition、CAAnimationGroup
1.CABasicAnimation
经过设定起始点,终点,时间,动画会沿着你这设定点进行移动。能够看作特殊的CAKeyFrameAnimation
2.CAKeyframeAnimation
Keyframe顾名思义就是关键点的frame,你能够经过设定CALayer的始点、中间关键点、终点的frame,时间,动画会沿你设定的轨迹进行移动
3.CAAnimationGroup
Group也就是组合的意思,就是把对这个Layer的全部动画都组合起来。PS:一个layer设定了不少动画,他们都会同时执行,如何按顺序执行我到时候再讲。
4.CATransition
这个就是苹果帮开发者封装好的一些动画
(2)CAMediaTiming是一个协议(protocol)。
CAPropertyAnimation是CAAnimation的子类,可是不能直接使用,要想建立动画对象,应该使用它的两个子类:CABasicAnimation和CAKeyframeAnimation
它有个NSString类型的keyPath属性,你能够指定CALayer的某个属性名为keyPath,而且对CALayer的这个属性的值进行修改,达到相应的动画效果。好比,指定@"position"为keyPath,就会修改CALayer的position属性的值,以达到平移的动画效果
5、Core Animation的使用步骤
1.使用它须要先添加QuartzCore.framework框架和引入主头文件<QuartzCore/QuartzCore.h>(iOS7不须要)
2.初始化一个CAAnimation对象,并设置一些动画相关属性
3.经过调用CALayer的addAnimation:forKey:方法增长CAAnimation对象到CALayer中,这样就能开始执行动画了
4.经过调用CALayer的removeAnimationForKey:方法能够中止CALayer中的动画
在iOS中,展现动画能够类比于显示生活中的“拍电影”。拍电影有三大要素:演员+剧本+开拍,概念类好比下:
演员--->CALayer,规定电影的主角是谁
剧本--->CAAnimation,规定电影该怎么演,怎么走,怎么变换
开拍--->AddAnimation,开始执行
详见代码。。。。。。
6、补充说明
全部动画对象的父类,负责控制动画的持续时间和速度,是个抽象类,不能直接使用,应该使用它具体的子类
属性解析:
(来自CAMediaTiming协议的属性)
duration:动画的持续时间
repeatCount:动画的重复次数
repeatDuration:动画的重复时间
fillMode:决定当前对象在非active时间段的行为.好比动画开始以前,动画结束以后
beginTime:能够用来设置动画延迟执行时间,若想延迟2s,就设置为CACurrentMediaTime()+2,CACurrentMediaTime()为图层的当前时间
(非CAMediaTiming协议的属性)
removedOnCompletion:默认为YES,表明动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。若是想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards
timingFunction:速度控制函数,控制动画运行的节奏
delegate:动画代理
代码用
/*
OC中的动画效果总结
1.视图动画
2.帧动画
1.什么是图层CALayer?
核心动画的全部效果都是基于图层的,没有图层也就没有核心动画效果
2.视图为何可以显示到屏幕上?
1.调用drawRect方法,若是咱们本身绘制了东西,他会显示出来
2.在显示图形以前他会建立一个图层对象(CALayer),而后把须要画的东西都放到图层上,而后呈现给用户看
3.没有图层就没有视图的显示功能,也就是没有图层就没有界面
3.图层可以用来作什么?
使用图层来操做视图的外观属性,这也是学习图层的主要目的
1.阴影效果
2.边框效果
3.圆角效果
4.更强大的动画效果
*/
/*
1.根层
全部的视图,默认状况下都有一个layer层对象,这个层就是根层
经过addSubLayer添加的层都是子层
2.隐式动画都是相对于子层来讲的
当修改了某个子层的属性的时候,会默认产生动画效果,就是所谓的隐式动画
3.修改哪些属性会产生隐式动画效果
1.Frame 缩放动画
2.backgroundColor 会产生颜色渐变更画
4.关闭隐式动画
CATransaction 是layer内部设置隐士动画的开关
*/
/*
1.什么是核心动画?
是苹果提供的很是强大的动画处理API,可以作出很是绚丽的动画效果,并且使用的代码量很是少
2.核心动画是直接做用在CALayer上的
3.核心动画的基础功能都定义在CAAnimation中
CAAnimation提供了三个子类:
CAAnimationGroup
CATransaction
CAPropertyAnimation : CABasicAnimation,CAKeyframeAnimation
*/
//此外,动画的暂停与开始能够经过下面的方式作到:
-(IBAction)pause:(id)sender{
[self pauseLayer:self.layer];
}
-(IBAction)resume:(id)sender{
[self resumeLayer:self.layer];
}
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
//绕矩形循环跑(拓展)
- (void)initRectLayer
{
//新处理一下self.layer
self.layer.frame = CGRectMake(15, 200, 30, 30);
self.layer.cornerRadius = 15;
//来个帧动画
CAKeyframeAnimation *rectRunAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
//设定关键帧位置,必须含起始与终止位置
rectRunAnimation.values = @[
[NSValue valueWithCGPoint:self.layer.frame.origin],
[NSValue valueWithCGPoint:CGPointMake(320 - 15,self.layer.frame.origin.y)],
[NSValue valueWithCGPoint:CGPointMake(320 - 15,self.layer.frame.origin.y + 100)],
[NSValue valueWithCGPoint:CGPointMake(15, self.layer.frame.origin.y + 100)],
[NSValue valueWithCGPoint:self.layer.frame.origin]];
//设定每一个关键帧的时长,若是没有显式地设置,则默认每一个帧的时间=总duration/(values.count - 1)
rectRunAnimation.keyTimes = @[
[NSNumber numberWithFloat:0.0],
[NSNumber numberWithFloat:0.6],
[NSNumber numberWithFloat:0.7],
[NSNumber numberWithFloat:0.8],
[NSNumber numberWithFloat:1]];
rectRunAnimation.timingFunctions = @[
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
//重复次数
rectRunAnimation.repeatCount = 10;
//动画结束时是否执行逆动画
rectRunAnimation.autoreverses = NO;
//线性运动方式
rectRunAnimation.calculationMode = kCAAnimationLinear;
//持续时间
rectRunAnimation.duration = 4;
//添加动画
[self.layer addAnimation:rectRunAnimation forKey:@"rectRunAnimation"];
/**
CAKeyFrameAnimation的使用中有如下主要的属性须要注意
(1)values属性
values属性指明整个动画过程当中的关键帧点,例如上例中的A-E就是经过values指定的。须要注意的是,起点必须做为values的第一个值。
(2)path属性
做用与values属性同样,一样是用于指定整个动画所通过的路径的。须要注意的是,values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。例如上述pathAnimation例子
(3)keyTimes属性
该属性是一个数组,用以指定每一个子路径(AB,BC,CD)的时间。若是你没有显式地对keyTimes进行设置,则系统会默认每条子路径的时间为:ti=duration/(5-1),即每条子路径的duration相等,都为duration的1\4。固然,咱们也能够传个数组让物体快慢结合。例如,你能够传入{0.0, 0.1,0.6,0.7,1.0},其中首尾必须分别是0和1,所以tAB=0.1-0, tCB=0.6-0.1, tDC=0.7-0.6, tED=1-0.7.....
(4)timeFunctions属性
用过UIKit层动画的同窗应该对这个属性不陌生,这个属性用以指定时间函数,相似于运动的加速度,有如下几种类型。上例子的AB段就是用了淡入淡出效果。记住,这是一个数组,你有几个子路径就应该传入几个元素
1 kCAMediaTimingFunctionLinear//线性
2 kCAMediaTimingFunctionEaseIn//淡入
3 kCAMediaTimingFunctionEaseOut//淡出
4 kCAMediaTimingFunctionEaseInEaseOut//淡入淡出
5 kCAMediaTimingFunctionDefault//默认
(5)calculationMode属性
该属性决定了物体在每一个子路径下是跳着走仍是匀速走,跟timeFunctions属性有点相似
1 const kCAAnimationLinear//线性,默认
2 const kCAAnimationDiscrete//离散,无中间过程,但keyTimes设置的时间依旧生效,物体跳跃地出如今各个关键帧上
3 const kCAAnimationPaced//平均,keyTimes跟timeFunctions失效
4 const kCAAnimationCubic//平均,同上
5 const kCAAnimationCubicPaced//平均,同上
*/
}
//CAKeyframeAnimation
//CABasicAnimation算是CAKeyFrameAnimation的特殊状况,即不考虑中间变换过程,只考虑起始点与目标点就能够了。而CAKeyFrameAnimation则更复杂一些,容许咱们在起点与终点间自定义更多内容来达到咱们的实际应用需求,KeyFrame的意思是关键帧,所谓“关键”就是改变物体运动趋势的帧,在该点处物体将发生运动状态,好比矩形的四个角,抛物线的顶点等
- (CAAnimation*)pathAnimation
{
/**
CAKeyframeAnimation
在画线的时候,方法的内部默认建立一个path。它把路径都放到了path里面去。
1.建立路径 CGMutablePathRef 调用该方法至关于建立了一个路径,这个路径用来保存绘图信息。
2.把绘图信息添加到路径里边。
之前的方法是点的位置添加到ctx(图形上下文信息)中,ctx 默认会在内部建立一个path用来保存绘图信息。
在图形上下文中有一块存储空间专门用来存储绘图信息,其实这块空间就是CGMutablePathRef。
3.把路径添加到上下文中。
*/
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path,NULL,50.0,120.0);
CGPathAddLineToPoint(path, NULL, 300, 488);
CGPathAddCurveToPoint(path,NULL,50.0,275.0,150.0,275.0,150.0,120.0);
CGPathAddCurveToPoint(path,NULL,150.0,275.0,250.0,275.0,250.0,120.0);
CGPathAddCurveToPoint(path,NULL,250.0,275.0,350.0,275.0,350.0,120.0);
CGPathAddCurveToPoint(path,NULL,350.0,275.0,450.0,275.0,450.0,120.0);
CAKeyframeAnimation * animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
[animation setPath:path];
[animation setDuration:3.0];
CFRelease(path);
//ARC的诞生大大简化了咱们针对内存管理的开发工做,可是只支持管理 Objective-C 对象, 不支持 Core Foundation 对象。Core Foundation 对象必须使用CFRetain和CFRelease来进行内存管理
//http://blog.csdn.net/yiyaaixuexi/article/details/8553659
return animation;
}