iOSCoreAnimation动画系列教程(一):CABasicAnimation【包会】

在iOS中,图形可分为以下几个层次:

越上层,封装程度越高,动画实现越简洁越简单,但是自由度越低;反之亦然。本文着重介绍Core Animation层的基本动画实现方案。

在iOS中,展示动画可以类比于显示生活中的“拍电影”。拍电影有三大要素:演员+剧本+开拍,概念类比如下:

演员--->CALayer,规定电影的主角是谁
剧本--->CAAnimation,规定电影该怎么演,怎么走,怎么变换
开拍--->AddAnimation,开始执行

一、概念介绍

1.1CALayer是什么呢?

复制代码
CALayer是个与UIView很类似的概念,同样有layer,sublayer...,同样有backgroundColor、frame等相似的属性,我们可以将UIView看做一种特殊的CALayer,只不过UIView可以响应事件而已。一般来说,layer可以有两种用途,二者不互相冲突:一是对view相关属性的设置,包括圆角、阴影、边框等参数,更详细的参数请点击这里;二是实现对view的动画操控。因此对一个view进行core animation动画,本质上是对该view的.layer进行动画操纵。
复制代码

1.2CAAnimation是什么呢?

CAAnimation可分为四种:

  • 1.CABasicAnimation
  • 通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。可以看做特殊的CAKeyFrameAnimation
  • 2.CAKeyframeAnimation
  • Keyframe顾名思义就是关键点的frame,你可以通过设定CALayer的始点、中间关键点、终点的frame,时间,动画会沿你设定的轨迹进行移动
  • 3.CAAnimationGroup
  • Group也就是组合的意思,就是把对这个Layer的所有动画都组合起来。PS:一个layer设定了很多动画,他们都会同时执行,如何按顺序执行我到时候再讲。
  • 4.CATransition
  • 这个就是苹果帮开发者封装好的一些动画

二、动手干活

实践出真知,看个例子就知道:

比如我们想实现一个类似心跳的缩放动画可以这么做,分为演员初始化、设定剧本、电影开拍三个步骤:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- ( 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" ];
}

 

1
2
3
4
5
- ( void )viewDidLoad {
     [ super  viewDidLoad];
     // Do any additional setup after loading the view from its nib.
     [ self  initScaleLayer];
}

  

效果请参考附图中的蓝色方块。其他效果可以依葫芦画瓢轻松实现。想要实现不同的效果,最关键的地方在于CABasicAnimation对象的初始化方式中keyPath的设定。在iOS中有以下几种不同的keyPath,代表着不同的效果:

此外,我们还可以利用GroupAnimation实现多种动画的组合,在GroupAnimation中的各个动画类型是同时进行的。

- ( void )initGroupLayer
{
     //演员初始化
     CALayer *groupLayer = [[CALayer alloc] init];
     groupLayer.frame = CGRectMake(60, 340+100 + kYOffset, 50, 50);
     groupLayer.cornerRadius = 10;
     groupLayer.backgroundColor = [[UIColor purpleColor] CGColor];
     [ self .view.layer addSublayer:groupLayer];
     [groupLayer release];
   
     //设定剧本
     CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@ "transform.scale" ];
     scaleAnimation.fromValue = [ NSNumber  numberWithFloat:1.0];
     scaleAnimation.toValue = [ NSNumber  numberWithFloat:1.5];
     scaleAnimation.autoreverses = YES ;
     scaleAnimation.repeatCount = MAXFLOAT;
     scaleAnimation.duration = 0.8;
     
     CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@ "position" ];
     moveAnimation.fromValue = [ NSValue  valueWithCGPoint:groupLayer.position];
     moveAnimation.toValue = [ NSValue  valueWithCGPoint:CGPointMake(320 - 80,
                                                                   groupLayer.position.y)];
     moveAnimation.autoreverses = YES ;
     moveAnimation.repeatCount = MAXFLOAT;
     moveAnimation.duration = 2;
     
     CABasicAnimation *rotateAnimation = [CABasicAnimation animationWithKeyPath:@ "transform.rotation.x" ];
     rotateAnimation.fromValue = [ NSNumber  numberWithFloat:0.0];
     rotateAnimation.toValue = [ NSNumber  numberWithFloat:6.0 * M_PI];
     rotateAnimation.autoreverses = YES ;
     rotateAnimation.repeatCount = MAXFLOAT;
     rotateAnimation.duration = 2;
     
     CAAnimationGroup *groupAnnimation = [CAAnimationGroup animation];
     groupAnnimation.duration = 2;
     groupAnnimation.autoreverses = YES ;
     groupAnnimation.animations = @[moveAnimation, scaleAnimation, rotateAnimation];
     groupAnnimation.repeatCount = MAXFLOAT;
     //开演
     [groupLayer addAnimation:groupAnnimation forKey:@ "groupAnnimation" ];
}

  

1
2
3
4
5
- ( void )viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view from its nib.
     [self initGroupLayer];

 完整的demo工程点CAAnimationDemo.zip下载 

原文地址:http://www.cnblogs.com/wengzilin/p/4256468.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值