您的位置:首页 > 移动开发 > IOS开发

Core Animation

2015-06-25 22:32 253 查看

Core Animation

一、简介

自行度娘吧!

二、使用步骤

1.使用它需要先添加QuartzCore.framework框架和引入主头文件 QuartzCore/QuartzCore.h (Xcode 6
4000
不需要);

2.初始化一个CAAnimation对象,设置相应的属性;

3.通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了;

4.通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画.

三、CAAnimation 继承关系与核心类

一般情况下,我们使用的是CAAnimation的子类(CABasicAnimation、CAKeyframeAnimation、CAAnimationGroup、CATransition)



CAAnimation:核心动画的基础类,不能直接使用,负责动画运行时间、速度的控制,本身实现了CAMediaTiming协议;

CAPropertyAnimation:属性动画的基类(通过属性进行动画设置,注意是可动画属性),不能直接使用;

CAAnimationGroup:动画组,动画组是一种组合模式设计,可以通过动画组来进行所有动画行为的统一控制,组中所有动画效果可以并发执行;

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

CABasicAnimation:基础动画,通过属性修改进行动画参数控制,只有初始状态和结束状态;

CAKeyframeAnimation:关键帧动画,同样是通过属性进行动画参数控制,但是同基础动画不同的是它可以有多个状态控制;

基础动画、关键帧动画都属于属性动画,就是通过修改属性值产生动画效果,开发人员只需要设置初始值和结束值,中间的过程动画(又叫“补间动画”)由系统自动计算产生。和基础动画不同的是关键帧动画可以设置多个属性值,每两个属性中间的补间动画由系统自动完成,因此从这个角度而言基础动画又可以看成是有两个关键帧的关键帧动画。

四、常用属性

1.duration:它设定开始值到结束值花费的时间。期间会被速度的属性所影响;

2.speed:默认的值为 1.0.这意味着动画播放按照默认的速度。如果你改变这个值为 2.0,动画会用 2 倍的速度播放。这样的影响就是使持续时间减半。如果你指定的持续时间为6秒,速度为2.0,动画就会播放 3 秒钟,一半的 持续时间;

3.removedOnCompletion:这个属性默认为 YES,那意味着,在指定的时间段完成后,动画就自动的从层上移除了。这个一般不用。假如你想要再次用这个动画时,你需要设定这个属性为 NO。这样的话,下次你在通过-set 方法设定动画的属性时,它将再次使用你的动画,而非默认的动画;

4.fillMode:fillMode的作用就是决定当前对象过了非active时间段的行为. 比如动画开始之前,动画结束之后。如果是一个动画CAAnimation,则需要将其removedOnCompletion设置为NO,要不然fillMode不起作用. 下面来讲各个fillMode的意义:

- kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态;

- kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态;

- kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态;

- kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态;

5.timingFunction可选的值有:

- kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉

- kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开

- kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地

- kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为.

baseAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];


6.autoreverses:当你设定这个属性为 YES 时,在它到达目的地之后,再原路返回开始值。

7.timeOffset:动画从偏移的地方开始动画,但结束的地方是偏移的地方

8.repeatCount:默认的是 0,意味着动画只会播放一次。如果指定一个无限大的重复次数,使用 1e100f。这个不能和repeatDration属性一块使用。

9.repeatDuration:这个属性指定了动画应该被重复多久。动画会一直重复,直到设定的时间流逝完。它不能和repeatCount一起使用。

10.additive:这个属性根据当前的渲染层的值加上value生成新的渲染的值,也就是动画时present layer的值。

下边的代码的动画效果是一样的,对比下values会有个明确的认识:

- (void)change
{
CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"position.x"];
animation.values = @[@0,@100,@(-100),@100,@0];
animation.keyTimes = @[@0,@(1/6.),@(3/6.),@(5/6.),@1];
animation.duration = 2.f;
animation.additive = YES; //YES把更改的值追加到当前的present层中 keypath+=value ,NO是把更改的值设置成当前present层的值keypath = value
[self.ly.layer addAnimation:animation forKey:@"shaking"];
---------
CAKeyframeAnimation* animation1 = [CAKeyframeAnimation animationWithKeyPath:@"position.x"];
animation1.values = @[@(self.ly1.center.x),@(self.ly1.center.x + 100),@(self.ly1.center.x - 100),@(self.ly1.center.x + 100),@(self.ly1.center.x)];
animation1.keyTimes = @[@0,@(1/6.),@(3/6.),@(5/6.),@1];
animation1.duration = 2.f;
animation1.additive = NO; //YES把更改的值追加到当前的model层中 keypath+=value ,NO是把更改的值设置成当前present层的值keypath = value
[self.ly1.layer addAnimation:animation1 forKey:@"shaking"];
[button animateWithType:arc4random()%3];
[self performSelector:@selector(change) withObject:nil afterDelay:3.f];
}


11.beginTime

无论是图层还是动画,都有一个时间线Timeline的概念,他们的beginTime是相对于父级对象的开始时间. 虽然苹果的文档中没有指明,但是通过代码测试可以发现,默认情况下所有的CALayer图层的时间线都是一致的,他们的beginTime都是0,绝对时间转换到当前Layer中的时间大小就是绝对时间的大小.所以对于图层而言,虽然创建有先后,但是他们的时间线都是一致的(只要不主动去修改某个图层的beginTime),所以我们可以想象成所有的图层默认都是从系统重启后开始了他们的时间线的计时.

但是动画的时间线的情况就不同了,当一个动画创建好,被加入到某个Layer的时候,会先被拷贝一份出来用于加入当前的图层,在CA事务被提交的时候,如果图层中的动画的beginTime为0,则beginTime会被设定为当前图层的当前时间,使得动画立即开始.如果你想某个直接加入图层的动画稍后执行,可以通过手动设置这个动画的beginTime,但需要注意的是这个beginTime需要为 CACurrentMediaTime()+延迟的秒数,因为beginTime是指其父级对象的时间线上的某个时间,这个时候动画的父级对象为加入的这个图层,图层当前的时间其实为[layer convertTime:CACurrentMediaTime() fromLayer:nil],其实就等于CACurrentMediaTime(),那么再在这个layer的时间线上往后延迟一定的秒数便得到上面的那个结果.

baseAnimation.beginTime = CACurrentMediaTime() + 1;


12.delegate:动画代理,用来监听动画的执行过程

@interface NSObject (CAAnimationDelegate)
// 动画开始执行的时候触发这个方法
- (void)animationDidStart:(CAAnimation *)anim;
// 动画执行完毕的时候触发这个方法
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end


以上是做动画时常用的属性(当然也包括不常用的);

五、动画类

1.CABasicAnimation

下面是一些简单的使用方法(看一眼就OK了):

CABasicAnimation *baseAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
baseAnimation.delegate = self;
baseAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(150, 450)];
baseAnimation.duration = 5.0f;
baseAnimation.removedOnCompletion = NO;
baseAnimation.speed = 2.0f;
baseAnimation.fillMode = kCAFillModeForwards;
baseAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[self.layer addAnimation:baseAnimation forKey:@"haha"];


CABasicAnimation 中使用比较多的是KeyPath,下面列出了一些(当然可以通过Xcode 帮助文档搜索“animatable properties“)



2.CAAnimationGroup

GroupAnimation可以实现多种动画的组合,在GroupAnimation中的各个动画类型是同时进行的。

//缩放动画
CABasicAnimation *scale = [CABasicAnimation animationWithKeyPath:@"transform"];
scale.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
scale.toValue   = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1)];

//平移
CABasicAnimation *position = [CABasicAnimation animationWithKeyPath:@"position"];
position.toValue = [NSValue valueWithCGPoint:CGPointMake(150, 450)];

//旋转
CABasicAnimation *rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotation.toValue = [NSNumber numberWithFloat:M_PI_2];

CAAnimationGroup *group = [CAAnimationGroup animation];
group.duration = 5;
group.speed    = 1;
group.animations = @[scale,rotation,position];
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
[self.layer addAnimation:group forKey:@"group"];


六、最后感谢一下引用的博客

http://geeklu.com/2012/09/animation-in-ios/

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

http://www.cnblogs.com/mjios/archive/2013/04/15/3021039.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios开发