之所以叫做关键帧动画是因为,这个类可以实现,某一属性按照一串的数值进行动画,就好像制作动画的时候一帧一帧的制作一样。

一般使用的时候  首先通过 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 or kCAAnimationCubicPaced, the keyTimes 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相关推荐

  1. core Animation之CAKeyframeAnimation(关键帧动画)

    CABasicAnimation的区别是:CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSA ...

  2. iOS CAKeyframeAnimation关键帧动画

    概述 作为新年的开篇文章,首先祝福各位同仁新年快乐,万事大吉,技术薪资更上一层楼. 本篇文章简单的介绍一下CAKeyframeAnimation关键帧动画,之前的一篇文章介绍过CABasicAnima ...

  3. XFile 关键帧动画的解析遇到的问题

    一.mesh 数据储存方式的修改 由于在设计CXFileMesh类时考虑不够全面,原CXFileMesh 类内部储存mesh数据采用的是vector模板.这使后来试图为该类添加支持3dsmax关键帧动 ...

  4. IOS开发教程第一季之02UI进阶day8合并IOS学习019--敲击、长按、轻扫、旋转,CALayer、锚点,CADisolayLink刷新,核心动画,关键帧动画,组动画,转场动画,画板案例

    1.创建并实现手势的基本步骤 点击手势 #import "ViewController.h"@interface ViewController () @property (weak ...

  5. Windows Phone开发(39):漫谈关键帧动画上篇 转:http://blog.csdn.net/tcjiaan/article/details/7550506...

    尽管前面介绍的几种动画会让觉得很好玩了,但是,不知道你是否发现,在前面说到的一系列XXXAnimation中,都有一个共同点,那就是仅仅针对两个值的目标值之间产生动画,如果使用By,将在原值和加上By ...

  6. Windows Phone开发(41):漫谈关键帧动画之下篇

    原文:Windows Phone开发(41):漫谈关键帧动画之下篇 也许大家已经发现,其实不管什么类型的动画,使用方法基本是一样的,不知道大家总结出规律了没有?当你找到规律之后,你会发现真的可以举一反 ...

  7. css3关键帧动画以及兼容性策略

    一.关键帧动画 animation 属性 两个关键词 :调用动画 animation.定义关键帧(动画) @keyframes 1.定义关键帧 兼容性前缀 @-webkit-keyframes,谷歌 ...

  8. bada 2D游戏编程之十——关键帧动画原理

    bada 2D游戏编程之十--关键帧动画原理 前面提到的逐帧动画有一个关键的缺点就是需要为动画中的每一帧都提供一张单独的图片,由于每一帧的图片都需要单独提供,制作起来比较麻烦,图片量也比较大.用关键帧 ...

  9. 关键帧动画html例子,Bounce.js 是一个漂亮的CSS3关键帧动画生成工具和类库_前端开发者...

    Bounce. bouncejs.com提供的工具支持生成静态关键帧, 不需要使用额外JavaScript代码, 如果想在你的应用程序中动态生成这些代码, 可以使用Bounce. 安装可以通过Bowe ...

最新文章

  1. 人人都能学会的python编程教程14:高级特性1
  2. DEDE利用Ajax实现调用当前登录会员的信息简要说明
  3. Why is OFDMA a Magical Feature in the 802.11ax Standard?
  4. 黑龙江认识电子计算机ppt,《第22课 不断发展的现代社会》优秀教案(黑龙江县级优课).docx...
  5. 20170710L07-09-03老男孩Linux运维实战培训-Sersync实时同步软件实战应用指南07
  6. boost::multi_array模块调整 multi_arrays 大小的测试
  7. 手把手教你如何用Python制作一个电子相册?末附python教程
  8. mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官
  9. Python 第三方模块之 numpy.linalg - 线性代数
  10. mysql 101_MySQL 调优/优化的 101 个建议!
  11. 史上最全的常用事件:移动端事件及PC端:鼠标/键盘/表单事件
  12. WARNING:Result from SERVER not valid. Partial Result:
  13. 《逆袭进大厂》第二弹之C++进阶篇59问59答(超硬核干货)
  14. 数据库插中文变问号,Mybatis存储数据乱码,linux服务器上MySQL数据库乱码
  15. 以.a(a为后缀)的文件类型是啥鸭?
  16. Silverlight 下载
  17. 数据挖掘 | 航空公司客户价值分析
  18. 【Element-ui 踩坑记录 2022/10/31】
  19. 编程工具│Fiddler 抓包 mumu 模拟器详细配置步骤
  20. 征途2s 服务器文件,征途2 部分服务器更新内容介绍!

热门文章

  1. python培训 马哥 教室
  2. Gbase 8a MPP Cluster维护过程中可能遇到的故障管理(五)
  3. 公司邮箱一般是什么邮箱?外贸企业邮箱哪家稳定?
  4. 伦敦用人脸识别抓错人!专家:要结合DNA技术才行 | 研究
  5. 最新App、手机网站尺寸规范—移动设备界面UI设计尺寸规范
  6. 计算机农业sci,IEEE旗下JCR1区智慧农业类SCIEI期刊
  7. web 基础练习/设计专业课程导航(7)
  8. 阿里音乐流行趋势预测大赛一起做-(6)小结
  9. 业绩不稳的永信至诚,能稳坐国内网络靶场的头把交椅吗?
  10. android go官方下载,安卓11go版本下载-安卓11go版本官方下载安装 -优盘手机站