CABasicAnimation精讲

前言

本教程写了这个效果图的demo,同时总结CABasicAnimation的使用方法。

看完gif动画完,看到了什么?平移、旋转、缩放、闪烁、路径动画。

实现平移动画

实现平移动画,我们可以通过transform.translation或者水平transform.translation.x或者垂直平移transform.translation.y添加动画。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

// 平移动画

- (void)baseTranslationAnimation {

UIView *springView = [[UIView alloc] initWithFrame:CGRectMake(0, 380, 50, 50)];

[self.view addSubview:springView];

springView.layer.borderColor = [UIColor greenColor].CGColor;

springView.layer.borderWidth = 2;

springView.backgroundColor = [UIColor redColor];

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.translation"];

animation.duration = 2;

CGFloat width = self.view.frame.size.width;

animation.toValue = [NSValue valueWithCGPoint:CGPointMake(width - 50, 0)];

// 指定动画重复多少圈是累加的

animation.cumulative = YES;

// 动画完成是不自动很危险

animation.removedOnCompletion = NO;

// 设置移动的效果为快入快出

animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

// 设置无限循环动画

animation.repeatCount = HUGE_VALF;

// 设置动画完成时,自动以动画回到原点

animation.autoreverses = YES;

// 设置动画完成时,返回到原点

animation.fillMode = kCAFillModeForwards;

[springView.layer addAnimation:animation forKey:@"transform.translation"];

}

translation是平移的意思,大家需要记住它。这里只是水平移动,其实我们可以直接对transform.translation.x设置动画。不过直接使用transform.translation也是可以的,我们设置y值为0就可以了。

首先,我们通过属性路径的方法来创建动画对象:

1

2

3

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.translation"];

我们设置目的地为水平移动到屏宽再减去控件的宽50,由于我们只是水平移动,垂直方向没有移动,因此第二个参数设置为0即可。我们需要明确一点,toValue这里是指移动的距离而不是移到这个点:

1

2

3

animation.toValue = [NSValue valueWithCGPoint:CGPointMake(width - 50, 0)];

对于其它属性的设置,看注释里的说明就可以明白了。

旋转动画

旋转动画需要借助CATransform3D这个表示三维空间的结构体,可以X轴旋转、Y轴旋转、Z轴旋转:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// 旋转动画

- (void)baseRotationAnimation {

UIView *springView = [[UIView alloc] initWithFrame:CGRectMake(0, 240, 50, 50)];

[self.view addSubview:springView];

springView.layer.borderColor = [UIColor greenColor].CGColor;

springView.layer.borderWidth = 2;

springView.backgroundColor = [UIColor redColor];

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];

animation.duration = 2;

// Z轴旋转180度

CATransform3D transform3d = CATransform3DMakeRotation(3.1415926, 0, 0, 180);

animation.toValue = [NSValue valueWithCATransform3D:transform3d];

animation.cumulative = YES;

animation.removedOnCompletion = NO;

animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

animation.repeatCount = HUGE_VALF;

animation.autoreverses = YES;

animation.fillMode = kCAFillModeForwards;

[springView.layer addAnimation:animation forKey:@"transform"];

}

我们通过属性路径创建动画:

1

2

3

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];

然后通过创建CATransform3D结构体,指定旋转的角度为180度,X、Y轴不旋转,Z轴旋转180度:

1

2

3

4

CATransform3D transform3d = CATransform3DMakeRotation(3.1415926, 0, 0, 180);

animation.toValue = [NSValue valueWithCATransform3D:transform3d];

其它属性设置与平移动画一样。

缩放动画

transform.scale这个是图的属性路径,设置scale值就可以达到缩放的效果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

// 缩放动画

- (void)baseScaleAnimation {

UIView *springView = [[UIView alloc] initWithFrame:CGRectMake(0, 120, 50, 50)];

[self.view addSubview:springView];

springView.layer.borderColor = [UIColor greenColor].CGColor;

springView.layer.borderWidth = 2;

springView.backgroundColor = [UIColor redColor];

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];

animation.duration = 2;

animation.fromValue = @(1);

animation.toValue = @(0);

animation.removedOnCompletion = NO;

animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

animation.repeatCount = HUGE_VALF;

animation.autoreverses = YES;

animation.fillMode = kCAFillModeForwards;

[springView.layer addAnimation:animation forKey:@"transform.scale"];

}

我们通过属性路径方法创建动画对象:

1

2

3

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];

我们设置了初始变换和最终变换为1和0:

1

2

3

4

animation.fromValue = @(1);

animation.toValue = @(0);

其实由于图初始状态值为正常状态,没有任何缩放,因此其值本就是1,所以fromValue可以不设置的。

闪烁动画

我们这里说的闪烁动画其实就是透明度的变化,当然我们不能通过alpha值的变化来实现闪烁动画,因此这个属性是不具备隐式动画效果的。不过系统提供了opacity,我们可以通过这个值的变化来实现闪烁效果。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

// 闪烁动画

- (void)baseSpringAnimation {

UIView *springView = [[UIView alloc] initWithFrame:CGRectMake(0, 50, 50, 50)];

[self.view addSubview:springView];

springView.layer.borderColor = [UIColor greenColor].CGColor;

springView.layer.borderWidth = 2;

springView.backgroundColor = [UIColor redColor];

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];

animation.duration = 2;

animation.fromValue = @(1);

animation.toValue = @(0);

animation.removedOnCompletion = NO;

animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

animation.repeatCount = HUGE_VALF;

animation.autoreverses = YES;

animation.fillMode = kCAFillModeForwards;

[springView.layer addAnimation:animation forKey:@"opacity"];

}

我们通过属性路径opacity来创建动画对象,注意不能使用alpha,否则不会有动画效果的:

1

2

3

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];

我们设置透明度从1->0变换,其它属性设置与上面平移动画一样:

1

2

3

4

animation.fromValue = @(1);

animation.toValue = @(0);

路径动画

路径动画这里添加了灰常详细的注释说明,几乎都包含了所有常用的属性设置了:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

// 路径动画

- (void)baseAnimation {

UIView *animationView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

animationView.layer.borderWidth = 2;

animationView.layer.borderColor = [UIColor redColor].CGColor;

animationView.backgroundColor = [UIColor greenColor];

[self.view addSubview:animationView];

// 添加动画

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];

// 起点,这个值是指position,也就是layer的中心值

animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 50)];

// 终点,这个值是指position,也就是layer的中心值

animation.toValue = [NSValue valueWithCGPoint:CGPointMake(self.view.bounds.size.width - 50,

self.view.bounds.size.height - 100)];

// byValue与toValue的区别:byValue是指x方向再移动到指定的宽然后y方向移动指定的高

// 而toValue是整体移动到指定的点

//  animation.byValue = [NSValue valueWithCGPoint:CGPointMake(self.view.bounds.size.width - 50 - 50,

//                                                            self.view.bounds.size.height - 50 - 50 - 50)];

// 线性动画

animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];

animation.removedOnCompletion = NO;

// 设定开始值到结束值花费的时间,也就是动画时长,单位为秒

animation.duration = 2;

// 播放速率,默认为1,表示常速

// 设置为2则以2倍的速度播放,同样设置为N则以N倍速度播放

// 如果值小于1,自然就是慢放

animation.speed = 0.5;

// 开始播放动画的时间,默认为0.0,通常是在组合动画中使用

animation.beginTime = 0.0;

// 播放动画的次数,默认为0,表示只播放一次

// 设置为3表示播放3次

// 设置为HUGE_VALF表示无限动画次数

animation.repeatCount = HUGE_VALF;

// 默认为NO,设置为YES后,在动画达到toValue点时,就会以动画由toValue返回到fromValue点。

// 如果不设置或设置为NO,在动画到达toValue时,就会突然马上返回到fromValue点

animation.autoreverses = YES;

// 当autoreverses设置为NO时,最终会留在toValue处

animation.fillMode = kCAFillModeForwards;

// 将动画添加到层中

[animationView.layer addAnimation:animation forKey:@"position"];

}

在图中position是层相对于父层的中心,而UI控件的center中心一样。这里要整体曲线路径移动,我们通过position中心点的变换就可以曲线路径移动。

这里设置了CAMediaTiming协议中的所有属性,详细看代码中的注释吧,已经很详细了!

时间: 2024-10-12 18:38:12

CABasicAnimation精讲的相关文章

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索 作用:会让索引建立的更加细致和完善 类型:静态映射和动态

面试必看:java面试考点干货精讲视频教程

Java作为目前比较火的计算机语言之一,连续几年蝉联最受程序员欢迎的计算机语言榜首,因此每年新入职Java程序员也数不胜数.很多java程序员在学成之后,会面临着就业的问题.在面试的过程中,面试技巧是一项很重要的能力. 今天要给大家介绍的是一个java经典面试套路精讲视频教程,需要的朋友可以看看,希望能帮助到大家! 课程目录: 第一节. String Stringbuffer Stringbuilder 深度解析第二节. 完美回答面试题Int 与Integer的区别第三节. 以数据结构挖掘集合面

《Linux系统精讲》学习总结(二)

本次总结我将采取总结性,对比性的方式一目了然的展示出来,首先将所有的命令总结在一起,然后对比性的总结部分知识点,最后谈谈本周的学习体会. 一.Linux系统精讲常用命令 格式:命令作用 命令 :命令语法:#注释说明或者补充 例如:创建目录 mkdir:mkdir -m/p 目录名称: 创建目录 mkdir:mkdir -m/p 目录名称: 删除目录 rmdir:rmdir -m/p 目录名称: rm:  rm -r 目录名称= rmdir;  #系统会询问是否删除: rm -f 目录名称:  

iOS开发——语法篇OC篇&高级语法精讲二

Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发.下面通过分析Apple开源的Runtime代码(我使用的版本是objc4-646.tar)来深入理解Objective-C的Runtime机制. Runtime数据结构 在Objective-C中,使用[receiver message]语法并不会马上执行receiver对象的message方

Oracle数据库精讲之数据库管理

Oracle数据库精讲之数据库管理 课程观看地址:http://www.xuetuwuyou.com/course/165 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件:oracle 11g 二.课程目标: 1. 为有意从事oracle dba工作人员提供学习指导. 2. 提供oracle数据库dba日常管理方法. 3. 掌握oracle数据库体系机构,为oracle优化奠定基础. 三.适合人群: 1.有意从事oracle 数据库工作,担任dba角色

Spark全面精讲视频_Spark2.0视频

Spark全面精讲(基于Spark2版本+含Spark调优+超多案例) 课程观看地址:http://www.xuetuwuyou.com/course/149 课程出自学途无忧网:http://www.xuetuwuyou.com/ 课程分五个阶段,共115课时! 第一阶段 Spark内核深度剖析 第00节课-课程特色和学习方式 第一节课-Spark概述(四大特性) 第二节课-Spark入门 第三节课-什么是RDD? 第四节课-spark架构 第五节课-linux环境准备(虚拟机,linux)

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到输入的搜索词设置一个数组里存放搜素词,判断搜索词在数组里是否存在如果存在删除原来的词,重新将新词放在数组最前面如果不存在直接将新词放在数组最前面即可,然后循环数组显示结果即可 热门搜索实现原理,当用户搜索一个词时,可以保存到数据库,然后记录搜索次数,利用redis缓存搜索次数最到的词,过一段时间更新

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time = datetime.now()获取当前时间 在搜索结束后:end_time = datetime.now()获取当前时间 last_time = (end_time-start_time).total_seconds()结束时间减去开始时间等于用时,转换成秒 from django.shortcu

第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html 创建自动补全字段 自动补全需要用到一个字段名称为suggest类型为Completion类型的一个字段 所以我们需要用