关闭

Core Animation动画概述

250人阅读 评论(0) 收藏 举报
分类:

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”如果valuesCGImagekey-path"contents"的话,则是图像切换;如果valuesCATransform3D,key-path“transform”,则是变换坐标。不要针对framesize等参数设置keyframe动画,似乎没有效果。position是可以的。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49582次
    • 积分:907
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:33篇
    • 译文:1篇
    • 评论:1条
    最新评论