Core Animation动画概述
1、概述
在iOS中,图形可分为以下几个层次:
越上层,封装程度越高,动画实现越简洁越简单,但是自由度越低。本文着重介绍Core Animation层的动画实现方案。
2、动画概念类
在iOS中,展示动画可以类比于显示生活中的“拍电影”。拍电影有三大要素:演员+剧本+开拍,概念类比如下:
演员--->CALayer,规定电影的主角是谁
剧本--->CAAnimation,规定电影该怎么演,怎么走,怎么变换
开拍--->AddAnimation,开始执行
1)、CAAnimation是什么呢?
CAAnimation是抽象类,定义了动画中“事务”遵循的规则。CAAnimation遵循CAMediaTiming协议和CAAction协议,CAMediaTiming协议用于调整时间,包括持续时间,速度,重复次数等;CAAction协议通过响应动作的方式来显示动画。
2)、CAAnimation子类可分为四种:
(1)、CABasicAnimation
通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。可以看做特殊的CAKeyFrameAnimation。对单一属性提供动画支持!
(2)、CAKeyframeAnimation
关键桢动画,可以定义行动路线,你可以通过设定CALayer的始点、中间关键点、终点的frame,时间,动画会沿你设定的轨迹进行移动。
(3)、CAAnimationGroup
Group也就是组合的意思,就是把对这个Layer的所有动画都组合起来。PS:一个layer设定了很多动画,他们都会同时执行,如何按顺序执行我到时候再讲。
(4)、CATransition
提供渐变效果,用在“显式动画”中时可以实现“过渡动画”!
(5)、CATransaction
事务类,可以对多个layer的属性同时进行修改。
(6)、CAConstraint
约束类,在布局管理器类中用它来设置属性。
(7)、CAConstraintLayoutManager
约束布局管理器,是用来将多个CALayer进行布局。各个CALayer是通过名称来区分,而布局属性是通过CAConstraint来设置的。
3)、CAAnimation类常用属性和函数说明:
(1)、@property(retain) id delegate//CAAnimation实例不能设置delegate为self,会引起循环引用。
(2)、@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion//设置是否动画完成后,动画效果从设置的layer上移除,默认为YES。
(3)、@property(retain) CAMediaTimingFunction *timingFunction//设置动画的“时机”效果,就是动画自身的“节奏”:比如:开始快,结束时变慢;开始慢,结束时变快;匀速;等。
(4)、speed:执行速度,如果速度为2,则一个10秒的duration,则只需要5秒完成。
(5)、repeatCount|repeatDuration:重复的次数和重复的间隔 ,如果repeatCount设置成 1e100f则无限重复
(6)、fillMode:决定动画结束时候的状态。要和removeOnCompletion参数一起设置才有效。动画结束后的状态并没有影响layer的位置,其实layer还在原来的地方没变。
此外还有duration,beginTime,timeOffset
(7)、autoreverses:当动画执行到toValue指定的状态时是否从toValue的状态逆回去
(8)、+ (id)animation//创建并返回一个CAAnimation实例。
(9)、+ (id)defaultValueForKey:(NSString *)key//根据属性key,返回相应的属性值。
(10)、- (BOOL)shouldArchiveValueForKey:(NSString *)key//返回指定的属性值是否可以归档。key:指定的属性。YES:指明该属性可以被归档;NO:不能被归档。
CAAnimation协议方法
(11)、- (void)animationDidStart:(CAAnimation *)theAnimation//动画开始时,执行的方法。theAnimation:正在执行动画的CAAnimation实例。
(12)、- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag//动画执行完成或者动画为执行被删除时,执行该方法。theAnimation:完成或者被删除的动画实例;flag:标志该动画是执行完成或者被删除,YES:执行完成;NO:被删除。
CABasicAnimation想要实现不同的效果,最关键的地方在于CABasicAnimation对象的初始化方式中keyPath的设定。在iOS中有以下几种不同的keyPath,代表着不同的效果:
二、显式动画举例
实践出真知,看个例子就知道:比如我们想实现一个类似心跳的缩放动画可以这么做,分为演员初始化、设定剧本、电影开拍三个步骤:
- (void)initScaleLayer
{
//演员初始化
CALayer *scaleLayer = [[CALayer alloc] init];
scaleLayer.backgroundColor = [UIColor blueColor].CGColor;
scaleLayer.frame = CGRectMake(60, 20 + kYOffset, 50, 50);
scaleLayer.cornerRadius = 10;
[self.view.layer addSublayer:scaleLayer];
[scaleLayer release];
//设定剧本
CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
scaleAnimation.fromValue = [NSNumber numberWithFloat:1.0];
scaleAnimation.toValue = [NSNumber numberWithFloat:1.5];
scaleAnimation.autoreverses = YES;
scaleAnimation.fillMode = kCAFillModeForwards;
scaleAnimation.repeatCount = MAXFLOAT;
scaleAnimation.duration = 0.8;
//开演
[scaleLayer addAnimation:scaleAnimation forKey:@"scaleAnimation"];
}
代码中有如下几个参数需要解释一下:
KeyPath:决定基础动画的类型,该值不能随便设置,一旦设置错误就达不到想要的效果。要改变位置就设置position相关,要改变透明度就设置opacity相关,,要等比缩放就设置transform.scale
fromValue:动画的起始状态,虽然iOS文档给出的是id,不过这里应该传NSValue对象,比如NSNumber
autoreverses:当动画执行到toValue指定的状态时是否从toValue的状态逆回去
fileMode:参考网址http://www.jianshu.com/p/cd1bc0e82f4d
对于CAKeyframeAnimation来说,一般用于移动复杂的位置,即KeyPath:@"position”。如果values是CGImage,key-path是"contents"的话,则是图像切换;如果values是CATransform3D的,key-path是“transform”,则是变换坐标。不要针对frame和size等参数设置keyframe动画,似乎没有效果。position是可以的。