CoreAnimation 详解

CAAnimation:核心动画的基础类,无法从来动用,负责动画运行时刻、速度的支配,本身实现了CAMedia提姆(Tim)ing协议。

CAPropertyAnimation:属性动画的基类(通过性能举行动画设置,注意是可动画属性),不能够一贯动用。

CAAnimationGroup:动画组,动画组是一种组成情势设计,可以因而动画组来举行具有动画行为的联合宰制,组中所有动画效果能够并发执行。

CATransition:转场动画,重要通过滤镜进行动画效果设置。

CABasicAnimation:基础动画,通过性能修改举办动画参数控制,只有起始状态和终止状态。

CAKeyframeAnimation:关键帧动画,同样是通过性能举办动画参数控制,可是同基础动画不同的是它可以有四个状况控制。

基本功动画、关键帧动画都属于属性动画,就是通过改动属性值发生动画效果,开发人士只需要安装起始值和了结值,中间的经过动画(又叫“补间动画”)由系统自动总括发生。和基础动画不同的是必不可缺帧动画可以设置多少个属性值,每多个特性中间的补间动画由系统活动完成,因而从那多少个角度而言基础动画又有何不可当做是有五个关键帧的最首要帧动画。

关系图

1.  CABasicAnimation – 基础动画

下边是个scale 缩放的例子:

 CABasicAnimation *scaleAnimation = [CABasicAnimation  

animationWithKeyPath:@”transform.scale“];

// 从1倍放大到1.5倍

scaleAnimation.fromValue = @(1.0);

scaleAnimation.toValue = @(1.5);

//scaleAnimation.begin提姆(Tim)e = CACurrentMedia提姆(Tim)e()+2;
//动画延迟执行时间

scaleAnimation.autoreverses = YES;
//设置这多少个特性表示完成动画后会回到执行动画此前的动静

//这五个属性要联手设置,表示维系执行动画后的规范不变(要想fillMode有效,最好设置removedOnCompletion=NO)

//scaleAnimation.removedOnCompletion = NO;

//scaleAnimation.fillMode = kCAFillModeForwards;

//重复次数

//scaleAnimation.repeatCount = 1;

//动画时间

scaleAnimation.duration = 0.8;

scaleAnimation.delegate = self; //代理(CAAnimationDelegate)

[self.customView.layer addAnimation:scaleAnimation
forKey:@”scaleAnimation”]; 

暂停/开始 动画:

-(void)animationPause{

//取得指定图层动画的媒体时刻,前面参数用于指定子图层,这里不需要

CFTimeInterval interval=[self.customView.layer
convertTime:CACurrentMediaTime() fromLayer:nil];

//设置时间偏移量,保证暂停时滞留在转动的岗位

self.customView.layer.timeOffset = interval;

//速度设置为0,暂停动画

self.customView.layer.speed=0;

}

-(void)animationResume{

//得到暂停的年月

CFTimeInterval beginTime= CACurrentMediaTime()-
self.customView.layer.timeOffset;

//设置偏移量

self.customView.layer.timeOffset=0;

//设置先导时间

self.customView.layer.beginTime=beginTime;

//设置动画速度,起始运动

self.customView.layer.speed=1.0;

}

代理就六个回调:

– (void)animationDidStart:(CAAnimation *)anim;

– (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

表达下 fillMode 属性以及 “animationWithKeyPath:” 这么些字符串参数:

fillMode 有这多少个档次:

/**

kCAFillModeRemoved
这个是默认值,也就是说当动画肇始前和卡通片截至后,动画对layer都未曾影响,动画结束后,layer会恢复生机到事先的意况?.

kCAFillModeForwards 当动画截至后,layer会从来维持着卡通最终的状态.

kCAFillModeBackwards
在动画先导前,你假设将动画出席了一个layer,layer便即刻进入动画的发端状态并等候动画起初.
你可以这样设定测试代码,将一个卡通插足一个layer的时候延迟5秒执行.然后就会意识在动画没有从头的时候,只要动画被插足了layer,layer便处在动画起先状态
( 这里代表不是很驾驭)

kCAFillModeBoth
那么些实际上就是地点三个的合成.动画插足后开头在此以前,layer便处在动画起初状态,动画截止后layer保持动画最终的状

*/

“animationWithKeyPath:”  传的参数不可能错,比如上边的例证是缩放,就要写 
transform.scale“,假使想要设置水平依然前后移动就需要
transform.translation.x“或者 “transform.translation.y

切实参照下图:

可设置的性能-1

2.CAAimationGroup –  动画组成

对待于CABasicAnimation 就多了一个 用来存放在动画对象的 animations
 数组属性。

 下面是一个缩放平移绕y轴转动的三结合卡通:

CABasicAnimation *scaleAnimation = [CABasicAnimation
animationWithKeyPath:@”transform.scale”];

scaleAnimation.fromValue = @(1);

scaleAnimation.toValue = @(0.5);

scaleAnimation.autoreverses = YES;

CABasicAnimation *moveAnimation = [CABasicAnimation
animationWithKeyPath:@”transform.translation.x”];

moveAnimation.fromValue = @(0);

moveAnimation.toValue = @(100);

moveAnimation.autoreverses = YES;

CABasicAnimation *rotateAnimation = [CABasicAnimation
animationWithKeyPath:@”transform.rotation.y”];

rotateAnimation.fromValue = @(0);

rotateAnimation.toValue = @(2*M_PI);

rotateAnimation.autoreverses = YES;

CAAnimationGroup *groupAnnimation = [CAAnimationGroup
animation];

groupAnnimation.duration = 2;

groupAnnimation.autoreverses = YES;

groupAnnimation.animations = @[moveAnimation, scaleAnimation,
rotateAnimation];

groupAnnimation.repeatCount = MAXFLOAT;

[self.customView.layer addAnimation:groupAnnimation
forKey:@”groupAnnimation”];

3.CAKeyframeAnimation - 重中之重帧动画 

下面是一个利用  CAKeyframeAnimation 改变View 背景象的 小例子:

CAKeyframeAnimation *color = [CAKeyframeAnimation
animationWithKeyPath:@”backgroundColor”];

color.values = @[(id)[UIColor redColor].CGColor,(id)[UIColor
yellowColor].CGColor,(id)[UIColor blueColor].CGColor];

color.keyTimes = @[@0, @0.4,@0.6, @0.8,@1.1];

color.repeatCount = 1;

color.autoreverses = YES;

color.duration = 3;

[self.customView.layer addAnimation:color forKey:@”color”];

简单易行的介绍下常用的属性:

values:就是上述的NSArray对象。里面的因素称为”关键帧”(keyframe)。动画对象会在指定的年月(duration)内,依次显示values数组中的每一个着重帧
.

keyTimes:逐条关键帧的时间决定。

path:可以安装一个CGPathRef\CGMutablePathRef,让层跟着路径移动。path只对CALayer的anchorPoint和position起效果。假如你设置了path,那么values将被忽略

timingFunctions: 这么些特性用以指定时间函数,类似于活动的加速度。

(1) kCAMediaTimingFunctionLinear//线性

(2) kCAMediaTimingFunctionEaseIn//淡入

(3) kCAMediaTimingFunctionEaseOut//淡出

(4) kCAMediaTimingFunctionEaseInEaseOut//淡入淡出

(5) kCAMediaTimingFunctionDefault//默认

calculationMode:
该属性决定了实体在各样子路径下是跳着走仍然匀速走。

(1) const kCAAnimationLinear//线性,默认

(2) const
kCAAnimationDiscrete//离散,无中间过程,但key提姆es设置的流年依旧生效,物体跳跃地冒出在逐个关键帧上

(3) const kCAAnimationPaced//平均,keyTimes跟timeFunctions失效

(4) const kCAAnimationCubic//平均,同上

(5) const kCAAnimationCubicPaced//平均,同上

下边这些是 CAKeyframeAnimation 配合贝塞尔曲线 的大概例子: 

CAKeyframeAnimation *keyframeAnimation=[CAKeyframeAnimation
animationWithKeyPath:@”position”];

//2.装置路径

//绘制贝塞尔曲线

UIBezierPath *path = [[UIBezierPath alloc] init];

[path moveToPoint:CGPointMake(self.customView.layer.position.x,
self.customView.layer.position.y)];

[path addCurveToPoint:CGPointMake(55, 400)
controlPoint1:CGPointMake(10, 300) controlPoint2:CGPointMake(160,
280)];

keyframeAnimation.path=path.CGPath;//设置path属性

//设置任何属性

keyframeAnimation.duration=8.0;

keyframeAnimation.begin提姆e=CACurrentMedia提姆(Tim)e();//设置延迟2秒执行

keyframeAnimation.removedOnCompletion = NO;

keyframeAnimation.fillMode = kCAFillModeForwards;

//3.添加动画到图层,添加动画后就会履行动画

[self.customView.layer addAnimation:keyframeAnimation
forKey:@”KCKeyframeAnimation_Position”];

4. CATransition – 转场动画

简言之的例子:

CATransition *transition = [CATransition animation];

transition.duration = 2.0f;

transition.timingFunction = [CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseIn];

transition.type = kCATransitionMoveIn;

transition.subtype = kCATransitionFromRight;

[self.customView.layer addAnimation:transition forKey:@”animation”];

简短的牵线下 几个属性:

type : 有四种档次:

kCATransitionFade                  //交叉淡化过渡

kCATransitionMoveIn              //移动覆盖原图

kCATransitionPush                    //新视图将旧视图推出去

kCATransitionReveal                //底部显出来

subType: 同样四种

kCATransitionFromRight;

kCATransitionFromLeft(默认值)

kCATransitionFromTop;

kCATransitionFromBottom

参考链接:
http://www.cnblogs.com/wengzilin/p/4256468.html

             
http://www.bubuko.com/infodetail-1000965.html

             
http://www.cocoachina.com/ios/20141022/10005.html

             
http://www.cnblogs.com/wengzilin/p/4250957.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注