原关键帧动画CAKeyframeAnimation
之所以叫做关键帧动画是因为,这个类可以实现,某一属性按照一串的数值进行动画,就好像制作动画的时候一帧一帧的制作一样。
一般使用的时候 首先通过 animationWithKeyPath 方法 创建一个CAKeyframeAnimation实例,
CAKeyframeAnimation 的一些比较重要的属性
1. path
这是一个 CGPathRef 对象,默认是空的,当我们创建好CAKeyframeAnimation的实例的时候,可以通过制定一个自己定义的path来让 某一个物体按照这个路径进行动画。这个值默认是nil 当其被设定的时候 values 这个属性就被覆盖
2. values
一个数组,提供了一组关键帧的值, 当使用path的 时候 values的值自动被忽略。
下面是一个简单的例子 效果为动画的连续移动一个block到不同的位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
CGMutablePathRef path = CGPathCreateMutable();
//将路径的起点定位到 (50 120)
CGPathMoveToPoint(path,NULL,50.0,120.0);
//下面5行添加5条直线的路径到path中
CGPathAddLineToPoint(path, NULL, 60, 130);
CGPathAddLineToPoint(path, NULL, 70, 140);
CGPathAddLineToPoint(path, NULL, 80, 150);
CGPathAddLineToPoint(path, NULL, 90, 160);
CGPathAddLineToPoint(path, NULL, 100, 170);
//下面四行添加四条曲线路径到path
CGPathAddCurveToPoint(path,NULL,50.0,275.0,150.0,275.0,70.0,120.0);
CGPathAddCurveToPoint(path,NULL,150.0,275.0,250.0,275.0,90.0,120.0);
CGPathAddCurveToPoint(path,NULL,250.0,275.0,350.0,275.0,110.0,120.0);
CGPathAddCurveToPoint(path,NULL,350.0,275.0,450.0,275.0,130.0,120.0);
//以“position”为关键字 创建 实例
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath: @"position" ];
//设置path属性
[animation setPath:path];
[animation setDuration:3.0];
//这句代码 表示 是否动画回到原位
// [animation setAutoreverses:YES];
CFRelease(path);
[self.block.layer addAnimation:animation forKey:NULL];
|
运行后 block会先沿着直线移动,之后再沿着设定的曲线移动,完全按照我们设定的“关键帧”移动。
下面一个例子是利用values制作的动画
1
2
3
4
5
6
7
8
9
10
11
|
CGPoint p1=CGPointMake(50, 120);
CGPoint p2=CGPointMake(80, 170);
CGPoint p3=CGPointMake(30, 100);
CGPoint p4=CGPointMake(100, 190);
CGPoint p5=CGPointMake(200, 10);
NSArray *values=[NSArray arrayWithObjects:[NSValue valueWithCGPoint:p1],[NSValue valueWithCGPoint:p2],[NSValue valueWithCGPoint:p3],[NSValue valueWithCGPoint:p4],[NSValue valueWithCGPoint:p5], nil];
CAKeyframeAnimation
*animation = [CAKeyframeAnimation animationWithKeyPath: @"position" ]; [animation setValues:values];
[animation setDuration:3.0];
[animation setAutoreverses:YES];
[self.block.layer addAnimation:animation forKey:NULL];
|
也非常简单,到目前位置,只用到了CAKeyframeAnimation的两个关键属性就能完成动画,下面的一些属性提供了更加细致化,更加强大的功能。
设定每一帧的时间
默认情况下,一帧动画的播放,分割 的时间是动画的总时间除以帧数减去一。你可以通过下面的公式决定每帧动画的时间:总时间/(总帧数-1)。 例如,如果你指定了一个 5 帧,10 秒的动画,那么每帧的时间就是 2.5 秒钟:10/(5-1)=2.5。你可以做更多 的控制通过使用 keyTimes 关键字,你可以给每帧动画指定总时间之内的某个时间点。
通过设置属性keyTimes,能实现这个功能,这个属性是一个数组,其成员必须是NSNumber。
同时 这个属性的设定值要与calculationMode属性相结合,同时他们有一定的规则,
The appropriate values in the keyTimes
array are dependent on the calculationMode
property.
If the calculationMode is set to
kCAAnimationLinear
, the first value in the array must be 0.0 and the last value must be 1.0. Values are interpolated between the specified key times.If the calculationMode is set to
kCAAnimationDiscrete
, the first value in the array must be 0.0.If the calculationMode is set to
kCAAnimationPaced
orkCAAnimationCubicPaced
, thekeyTimes
array is ignored。
如果keyTimes的值不合法,或者不符合上面的规则,那么就会被忽略。
1
2
3
4
5
|
[animation setCalculationMode:kCAAnimationLinear]; [animation setKeyTimes:
[NSArray arrayWithObjects:
[NSNumber numberWithFloat:0.0],
[NSNumber numberWithFloat:0.25], [NSNumber numberWithFloat:0.50],
[NSNumber numberWithFloat:0.75], [NSNumber numberWithFloat:1.0], nil]];
|
calculationMode
这个属性用来设定 关键帧中间的值是怎么被计算的
可选的值有
NSString * const kCAAnimationLinear; NSString * const kCAAnimationDiscrete; 只展示关键帧的状态,没有中间过程,没有动画。 NSString * const kCAAnimationPaced; NSString * const kCAAnimationCubic; NSString * const kCAAnimationCubicPaced; 关键帧动画的基础步骤
1.决定你想要做动画的属性(例如,框架,背景,锚点,位置,边框,等等) 2.在动画对象值的区域中,指定开始,结束,和中间的值。这些都是你的关键帧(看清单 4-2)
3.使用 duration 这个字段指定动画的时间
4.通常来讲,通过使用 times 这个字段,来给每帧动画指定一个时间。如果你没有指定这些,核心动画就
会通过你在 values 这个字段指定的值分割出时间段。
5.通常,指定时间功能来控制步调。 这些都是你需要做的。你创建你的动画和增加他们到层中。调用-addAnimation 就开始了动画。
原关键帧动画CAKeyframeAnimation相关推荐
- core Animation之CAKeyframeAnimation(关键帧动画)
CABasicAnimation的区别是:CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSA ...
- iOS CAKeyframeAnimation关键帧动画
概述 作为新年的开篇文章,首先祝福各位同仁新年快乐,万事大吉,技术薪资更上一层楼. 本篇文章简单的介绍一下CAKeyframeAnimation关键帧动画,之前的一篇文章介绍过CABasicAnima ...
- XFile 关键帧动画的解析遇到的问题
一.mesh 数据储存方式的修改 由于在设计CXFileMesh类时考虑不够全面,原CXFileMesh 类内部储存mesh数据采用的是vector模板.这使后来试图为该类添加支持3dsmax关键帧动 ...
- IOS开发教程第一季之02UI进阶day8合并IOS学习019--敲击、长按、轻扫、旋转,CALayer、锚点,CADisolayLink刷新,核心动画,关键帧动画,组动画,转场动画,画板案例
1.创建并实现手势的基本步骤 点击手势 #import "ViewController.h"@interface ViewController () @property (weak ...
- Windows Phone开发(39):漫谈关键帧动画上篇 转:http://blog.csdn.net/tcjiaan/article/details/7550506...
尽管前面介绍的几种动画会让觉得很好玩了,但是,不知道你是否发现,在前面说到的一系列XXXAnimation中,都有一个共同点,那就是仅仅针对两个值的目标值之间产生动画,如果使用By,将在原值和加上By ...
- Windows Phone开发(41):漫谈关键帧动画之下篇
原文:Windows Phone开发(41):漫谈关键帧动画之下篇 也许大家已经发现,其实不管什么类型的动画,使用方法基本是一样的,不知道大家总结出规律了没有?当你找到规律之后,你会发现真的可以举一反 ...
- css3关键帧动画以及兼容性策略
一.关键帧动画 animation 属性 两个关键词 :调用动画 animation.定义关键帧(动画) @keyframes 1.定义关键帧 兼容性前缀 @-webkit-keyframes,谷歌 ...
- bada 2D游戏编程之十——关键帧动画原理
bada 2D游戏编程之十--关键帧动画原理 前面提到的逐帧动画有一个关键的缺点就是需要为动画中的每一帧都提供一张单独的图片,由于每一帧的图片都需要单独提供,制作起来比较麻烦,图片量也比较大.用关键帧 ...
- 关键帧动画html例子,Bounce.js 是一个漂亮的CSS3关键帧动画生成工具和类库_前端开发者...
Bounce. bouncejs.com提供的工具支持生成静态关键帧, 不需要使用额外JavaScript代码, 如果想在你的应用程序中动态生成这些代码, 可以使用Bounce. 安装可以通过Bowe ...
最新文章
- 「摸鱼」神器来了,Python 实现人脸监测制作神器
- linux下访问windows的共享
- 公司为何要对薪水保密?
- 【C++ 语言】文件操作 ( fopen | fprintf | fscanf | fgets | fputc | fgetc | ofstream | ifstream )
- boost::serialization模块实现快速二进制归档的测试程序
- Linux下网络socket编程——实现服务器(select)与多个客户端通信
- Java四种线程池的使用
- 单片机备用电池供电电路_第五节(重排) 电子入门 复位电路
- fabric shim安装合约_hyperledger fabric 开发第一个智能合约
- mybatis入门基础(五)----动态SQL
- oracle序列修改语句
- 编译安装postfix+sasl+mysql+dovecot+extmail构建完成的邮件系统(一)
- 算法学习——枚举之最简真分数
- oracle ebs采购申请接口表,Oracle EBS BOM接口表操作.doc
- 机器学习和ai哪个好_AI可以使您成为更好的运动员吗? 使用机器学习分析网球发球和罚球...
- mac 下安装iwork+ps+nx2
- SketchUp Pro 2018 Mac OS X/Windows 64/32位产品下载
- 10.6 全源(All pairs)负权Johnson算法
- 视频教程-SAP快速入门-其他
- c语言三角函数例题,三角函数的诱导公式习题及答案解析.doc
热门文章
- 易优cms中英文版如何分开调用不同模板
- f15纸飞机折法_A4纸折F15战斗机的折法视频折纸飞机教程
- PhotoShop 基本操作介绍, 附带图文解说
- webpack源码解析
- 数据结构Java --- 泛型
- 【2017/07】实验记录——SSSP
- 《您的设计模式》(CBF4LIFE)之“状态模式”【整理】
- java胶囊咖啡机_雀巢Piccolo XS小星星胶囊咖啡机详细介绍
- 从老板进位“一超”、方太列席“多强”,看厨电市场的竞争关键
- 云栖大会,一场边缘云计算的「超前瞻」之约