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
协议中的所有属性,详细看代码中的注释吧,已经很详细了!
CABasicAnimation精讲的更多相关文章
- 深入Java核心 Java内存分配原理精讲
深入Java核心 Java内存分配原理精讲 栈.堆.常量池虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,详细讲解Java内存分配方面的知识. Java内存分 ...
- WKWebView API精讲(OC)
WKWebView API精讲(OC) 前言 鉴于LL同志对笔者说:“能不能写个OC版本的WKWebView的使用教程?”,还积极打赏了30RMB,笔者又怎么好意思拒绝呢,于是才有了下文. 所有看到本 ...
- 《VC++ 6简明教程》即VC++ 6.0入门精讲 学习进度及笔记
VC++6.0入门→精讲 2013.06.09,目前,每一章的“自测题”和“小结”三个板块还没有看(备注:第一章的“实验”已经看完). 2013.06.16 第三章的“实验”.“自测题”.“小结”和“ ...
- iOS开发——语法篇OC篇&高级语法精讲二
Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和 ...
- iOS开发——语法篇OC篇&高级语法精讲
高级语法精讲 一.NSSet.NSMutableSet集合的介绍 1)NSSet.NSMutableSet集合,元素是无序的,不能有重复的值. 2)用实例方法创建一个不可变集合对象 例如: //宏定义 ...
- iOS CAShapeLayer精讲
前言 CAShapeLayer继承自CALayer,因此,可使用CALayer的所有属性.但是,CAShapeLayer需要和贝塞尔曲线配合使用才有意义. 关于UIBezierPath,请阅读文章:i ...
- 【C++自我精讲】基础系列二 const
[C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...
- iOS-UI控件精讲之UIView
道虽迩,不行不至:事虽小,不为不成. 相关阅读 1.iOS-UI控件精讲之UIView(本文) 2.iOS-UI控件精讲之UILabel ...待续 UIView是所有UI控件的基类,在布局的时候通常 ...
- 【C++自我精讲】基础系列四 static
[C++自我精讲]基础系列四 static 0 前言 变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式. 1)动态存储方式的变量,生存期为变量所在的作用域.即程序运行到此变量时 ...
随机推荐
- poj 2948 Martian Mining (dp)
题目链接 完全自己想的,做了3个小时,刚开始一点思路没有,硬想了这么长时间,想了一个思路, 又修改了一下,提交本来没抱多大希望 居然1A了,感觉好激动..很高兴dp又有所长进. 题意: 一个row*c ...
- poj 3368 Frequent values(RMQ)
题目:http://poj.org/problem?id=3368 题意:给定n个数,顺序为非下降,询问某个区间内的数出现最多的数的 出现次数.. 大白书上的 例题..算是RMQ变形了, 对 原数组重 ...
- iOS开发:Swift多线程GCD的使用
除了上一篇文章说到到NSThread线程,还有一个GCD(Grand Central Dispath),是Apple新开发的一个解决多核编程的解决方案,充分的利用CPU资源,将所有的任务,放到一个任务 ...
- WEB-INF目录与META-INF目录的作用
/WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则. /WEB-INF/classes/包含了站点所有用的 class 文件,包括 ser ...
- UVa 11572 Unique snowflakes【滑动窗口】
题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素 看的紫书,滑动窗口来做的 当右端碰到有相同的数的时候,左端向前滑动一个数 模拟一个样例好理解些 #include<iostr ...
- BZOJ2626: JZPFAR
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2626 题解:裸K-Dtree,最大值?自己yy一下估价函数就好了. 两题居然是同一个错误,真是 ...
- UVA 10801 Lift Hopping 电梯换乘(最短路,变形)
题意: 有n<6部电梯,给出每部电梯可以停的一些特定的楼层,要求从0层到达第k层出来,每次换乘需要60秒,每部电梯经过每层所耗时不同,具体按 层数*电梯速度 来算.问经过多少秒到达k层(k可以为 ...
- Oracle AWR报告自动生成并ftp脚本
脚本主要由以下几个部分组成: awr.sql 用来在sqlplus 中执行的脚本,该脚本从网上直接找的. awr.sh 用来调用sqlplus来生成awr报告. ftp.sh 用来打包压缩每天生成的a ...
- 【转】第一次使用Android Studio时你应该知道的一切配置
原文网址:http://www.cnblogs.com/smyhvae/p/4390905.html [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.c ...
- jquery实现点击按钮滑动到指定位置
<body> <script type="text/javascript"> function click_scroll() { var scroll_of ...