前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >iOS 开发之动画中的时间

iOS 开发之动画中的时间

原创
作者头像
QQ音乐技术团队
修改于 2017-10-25 01:42:53
修改于 2017-10-25 01:42:53
2.6K00
代码可运行
举报
运行总次数:0
代码可运行

引言

iOS开发中使用动画时,可以通过设置动画的duration、speed、begintime、offset属性,来设置动画的时长、速度、起始时间及起始偏移。 用一个简单的例子来说明各个参数的的作用。动画很简单,一个红色的方块从左移到右边。动画的持续时间是1s,没有重复,效果如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    CFTimeInterval currentTime = CACurrentMediaTime();
    CFTimeInterval currentTimeInLayer = [self.testLayer convertTime:currentTime fromLayer:nil];
    CFTimeInterval addTime = currentTimeInLayer;
    anim.beginTime = 0.3 + addTime;
    [anim setTimeOffset:0.5];
    [anim setSpeed:2];

做修改以后,效果如下:

与上面相比,三处不同

  1. 动画的速度是原来的两倍。
  2. 点击开始动画的按钮,到开始动画,有一个延迟。
  3. 动画起始时,滑块的位置为中央,而不是在左边。

我们已经看到了这些属性的效果。翻阅文档,发现begintime、speed等属性是CAMediaTiming这协议的属性,并且CALayer、CAAnimation都遵守了CAMediaTiming协议。

那么CAMediaTiming协议是什么呢?有什么作用呢?

层级时间结构

根据文档,CMediaTiming协议构建了一个层级的时间系统,并用这个层级的时间系统来协调各个layer、animation的时间。

这个协议被CAAnimation及CALayer遵守,每一个遵守协议的的object对应一个time space。根据object之间的关系,不同的time space有层级关系。比如Layer A有一个subLayer B,那么Layer A对应的time space就是layer B对应的time space的parent time space。每一个time space中时间的数值都是根据parent time space的数值,以及begintime、speed等属性,根据一定的规则来计算的。

为了便于理解层级时间系统,先看下layer在屏幕上的显示位置是如何确定的,然后做一个类比。

layer层级如上。要确定sublayer1在屏幕上的显示位置,一共分三步。

  1. 确定window layer在屏幕位置position1
  2. 根据position1及view layer的position属性,确定view layer在屏幕中的位置position2
  3. 根据position2及sublayer1的position属性,确定sublayer1在屏幕中的位置position3

与此类似,要确定sub1ayer1中的time,也要分三步。

  1. 确定window layer中的time1
  2. 根据time1及view layer的begintime、offset等属性计算出view layer中的time2
  3. 根据time2及sublayer1的begintime、offset等属性计算出sublayer中的time3

和确定layer的位置相比,确定时间有一些复杂,主要提现在下面两点

1 . 层级时间系统的构成复杂。 layer tree的每一级都是CALayer,而只要遵守CAMediaTiming协议,就可以作为层级时间系统的一部分。比如CALayer、CAAnimation(及其子类CAAnimationGroup)都可以作为层级时间系统的一部分。

2 .不同层级之间时间转换规则复杂 计算当前layer的位置时,只需要知道父layer的位置,以及当前layer的position属性。计算当前层级时间时,不仅需要知道上一个层级的时间,还需要知道当前层级的begintime、offset、speed等属性。转换的规则也比较复杂,要经历两次转换。从parent time到active local time,再到basic local time。

active local time

这次转换是为了处理当前层级的object在父层级的的时间线上的位置,以及当前层级和父层级之间时间流逝速度的关系。

和这次转换相关的属性有beginTime、speed以及timeOffset

  1. begin time 子层级相对于父层级的起始时间。也就是父层级的时间经过多久,子层级才开始计算时间。 比如子层级A被加入层级时间系统时,它父层级B的时间是5s,子层级A的begintime是6s,那么当它父层级的时间变为6s时,子层级才开始计算时间。
  2. speed 子层级相对于父层级的时间流逝速度。如果speed是2,那么当父层级的时间增加了10s时,子层级的时间增加了20s(10s的2倍)。
  3. timeOffset 为本地时间增加一个偏移。 如果timeOffset是5s,那么本地时间的起始就是5s。 从parent time到active local time有一个公式,可以用来参考。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
t = (tp - begin) * speed + offset
basic local time

这次转换是为了处理当前层级的重放(repeat)、以及重放之前是否要倒放(play backward)等操作。

比如当前层级是一个动画(CAAnimation遵守CAMediaTiming协议),duration是1s,经过第一次转换之后的active local time是5.5s。如果动画的repeatCount是10,那么经过第二次转化以后,basic local time会是0.5s,因此当前是动画展示一半的状态。

1 .repeatCount及repeatDuration 当前的层级要重复的次数或重复的时间,两者不可同时指定。 以动画为例,如果指定repeatCount,那么指定了动画要重复几次。如果指定了repeatDuration,那么指定了动画重复的时间。 2 .autoreverses 在重复之前是否要倒放。

文首的例子

根据这些知识,可以解释文章开始时设置参数的效果。 当动画被加到layer上时,动画对应的time space被加到层级时间系统中,是layer对应的time space的子层级。

1 .动画的速度是原来的两倍 设置动画的speed是2,这样子动画中的时间流逝速度时layer中时间流逝速度的2倍。当layer中时间经过0.5s时,动画中时间已经流逝了1s,动画已经完成了。(动画的duration是1s) 2 .点击开始动画的按钮,到开始动画,有一个延迟 我们首先得到了当前layer的时间addtime,然后把动画的begintime设置为addtime+0.3。这样子当动画被加到layer之后0.3s,layer中的时间是addtime+0.3,此时动画中的时间才开始计算,之前动画没有开始。 3 .动画起始时,滑块的位置为中央,而不是在左边 我们设置了动画的offset为0.5s。当动画开始时,动画对应的time space的时间是0.5s,对应动画duration的一半,即滑块位置在屏幕中央。

更多应用

了解了CAMediaTiming协议后,可以实现很多动画的效果。

  1. 让某一个layer上的动画停止 设置layer的speed为0即可。
  2. 实现门打开然后关闭的效果 实现一个门打开的动画,然后把动画的autoreverses属性设置为YES即可。
  3. layer上的若干动画依次延迟启动 分别设置这些动画的beginTime为不同的值即可
  4. 手动控制动画的进度 设置动画的speed为0,然后改变动画的offset即可。

苹果已经把工具给我们了,可以做出什么样的产品就看大家的想象力了。

参考

控制动画时间: http://ronnqvi.st/controlling-animation-timing/

Time Warp in Animation:http://wangling.me/2011/06/time-warp-in-animation.html#fn-1

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实践-跑马灯效果及实现过程解析
前言 最近闲来无事,把自己之前做的一款跑马灯效果做个总结,也算温习了一下相关的知识。 效果 跑.gif 实现过程 设置一个背景ViewA,背景的左右两端加上正方形的颜色渐变的图层。 设置一个上面有gi
進无尽
2018/09/12
1.1K0
实践-跑马灯效果及实现过程解析
iOS Core Animation:Advanced Techniques
到目前为止,我们已经探讨过CALayer类了,同时我们也了解到了一些非常有用的绘图和动画功能。但是Core Animation图层不仅仅能作用于图片和颜色而已。本章就会学习其他的一些图层类,进一步扩展使用Core Animation绘图的能力。
conanma
2021/09/02
1.9K0
老司机带你走进Core Animation 之CAAnimation
开玩笑的,前段时间ipv6被拒啊,超级悲剧的,前后弄了好久,然后需求啊什么的又超多,所以写好的东西也没有时间整理。不过既然我现在回来了,那么这将是一个井喷的时节。(感觉给自己立下了什么死亡flag,啧啧啧)
老司机Wicky
2018/08/22
1.4K0
老司机带你走进Core Animation 之CAAnimation
iOS动画-CAAnimation使用详解
理解了隐式动画后,显式动画就更加通俗易懂了。区别于隐式动画的特点,显式动画就是需要我们明确指定类型、时间等参数来实现效果的动画。除此之外,我们也可以创建非线性动画,比如沿着任意一条曲线运动等; 我们平时最常用的也是显式动画,不仅系统为我们的视图提供了UIViewAnimationWithBlock的动画封装,而且我们在熟悉了Core Animation的动画属性后也可以很方便的设置显式动画;
梧雨北辰
2019/05/07
2.4K0
iOS动画-CAAnimation使用详解
绘图-CAShapeLayer、CABasicAnimation以及核心动画
QeartzCore是iOS中的图层框架,Quartz Core 的渲染能力可以像三维一样对二维图像进行任意操纵,在这个框架中我们可以对试图的图层进行定制,以实现我们想要的效果。 下面看一下这个框架中的类文件有哪些:
進无尽
2018/09/12
3K0
绘图-CAShapeLayer、CABasicAnimation以及核心动画
iOS Core Animation的用法
越上层,封装程度越高,动画实现越简洁越简单,但是自由度越低;反之亦然。本文着重介绍Core Animation层的基本动画实现方案。
码客说
2019/10/22
1.4K0
【IOS开发进阶系列】动画专题
http://doc.okbase.net/Hello_Hwc/archive/123447.html
江中散人_Jun
2023/10/16
5840
【IOS开发进阶系列】动画专题
iOS动画专题·UIView二维形变动画与CAAnimation核心动画(transform动画,基础,关键帧,组动画,路径动画,贝塞尔曲线)
总的来说,从涉及类的形式来看,iOS动画有:基于UIView的仿射形变动画,基于CAAnimation及其子类的动画,基于CG的动画。这篇文章着重总结前两种动画。
陈满iOS
2018/09/10
3.4K0
iOS动画专题·UIView二维形变动画与CAAnimation核心动画(transform动画,基础,关键帧,组动画,路径动画,贝塞尔曲线)
ios动画
在iOS开发中,动画是提高用户体验重要的环节之一。一个设计严谨、精细的动画效果能给用户耳目一新的效果,这对于app而言是非常重要的。 简介 iOS动画主要是指Core Animation框架。官方使用文档地址为:Core Animation Guide。Core Animation是iOS和macOS平台上负责图形渲染与动画的基础框架。Core Animation可以作用与动画视图或者其他可视元素,为你完成了动画所需的大部分绘帧工作。你只需要配置少量的动画参数(如开始点的位置和结束点的位置)即可使用Core
xiangzhihong
2018/01/26
7440
从案例出发,由浅到深了解 iOS 动画
iOS 的动画框架很成熟,提供必要的信息,譬如动画的起始位置与终止位置,动画效果就出来了
猿_人类
2019/11/07
7870
iOS动画系列之四:基础动画之平移篇2. 创建不同速度控制的动画3. Swift版本的部分差异
最终实现的效果: 基础动画之平移效果 1. 基础版的平移 这里重点是为了演示fromValue/toValue 、 设置layer的Position位置、实现代理方法里面设置position的区别。
stanbai
2018/06/28
2.9K0
视图自己定义旋转动画 相似百度音乐
self.imgview.layer.cornerRadius = 150.0 / 2.0;
全栈程序员站长
2022/07/10
2580
iOS 动画笔记 (一)
你也肯定喜欢炫酷的动画! 在APP中,动画就是一个点睛之笔!可以给用户增加一些独特的体验感,估计也有许多的和我一样的,看着那些觉得不错的动画,也就只能流口水的孩子,毕竟可能不知道从哪里下手去写!动画学习的过程我会总结一个系列的出来,总结一下iOS中动画的一个学习的过程,以及当中出现的一些问题也会和大家分享。现总结几点在学习动画之前的知道的一些点,这些能帮助我们写好学好动画。 一:从这里 Quartz2D 开始 在我的学习过程中,我是先从 Quartz2D 开始学习的,它里面的贝塞尔曲线在我们
Mr.RisingSun
2018/01/12
8290
iOS 动画笔记 (一)
Quartz2D复习(四) --- 图层CALayer和动画CAAnimation
1)、在ios中,能看得见摸得着的东西基本上都是UIView, 比如按钮、文本标签、文本输入框、图标等,这些都是UIView
tandaxia
2018/09/27
1.5K0
Quartz2D复习(四) --- 图层CALayer和动画CAAnimation
iOS动画系列之七:实现类似Twitter的启动动画1. CAKeyframeAnimation2. CAAnimationGroup3. 实现类似Twitter的启动动画
来来来,今天咱们通过实现一个类似Twitter的启动动画来看看CAKeyFrame Animation和CAAnimation Group怎么玩。 所以今天咱们的重点到了第七章,CAKeyFrame Animation和CAAnimation Group。最后的那个启动动画完全是为了实践一下看看CAKeyFrame Animation和CAAnimation Group怎么使用。 有读者私下说更新速度太慢了。在码云上看了一下下载的统计,发现其实下载的童鞋并不是特别多。如果只是看看思路,或者复习一下这些基础知
stanbai
2018/06/28
1.4K0
ARKit中控制.dae动画的播放
4.用时间控制动画--CAAnimation 里的 timeOffset 控制开始时间 duration控制播放时间
2018/05/07
2.2K1
iOS动画-CALayer基础知识
核心动画Core Animation,其实是由Layer Kit这样一个名字演变而来。它实际上是一个复合引擎,可以将存储在图层树体系中的不同独立图层,尽可能快地组合成不同的可视内容呈现于屏幕上;所以做动画只是Core Animation的特性之一;
梧雨北辰
2019/04/22
1.9K0
iOS动画-CALayer基础知识
iOS 动画基础总结篇
美女镇楼.JPG 好久没有更新简书了,最近在看一个动画的第三方,想着是时候可以把动画相关的东西总结下了!对了,上面的美女是龙母!哈哈,最近看权力游戏,感觉很好! -------------------------------------------------进入正题------------------------------------------------------------------ 动画的大体分类(个人总结可能有误) 分类.png UIView 动画 属性动画 [UIView beg
陈雨尘
2018/06/07
1.1K0
CALayer
Layers 通常被用于去提供views的后备存储. A layer’s 的主要工作是管理您提供的视觉内容,但layer’s本身视觉属性可以设置,如背景颜色,边境,和阴影。除了管理视觉内容,该层还维护其内容的几何信息(比如它的位置、大小和变换),用于在屏幕上显示这些内容。修改layer的属性决定着你怎么样在layer几何内容上启动动画。对象封装一层一层的持续时间和节奏及其动画采用CAMediaTiming协议,它定义了层的计时信息。
星宇大前端
2022/06/02
3250
iOS动画三板斧(二)--CoreAnimation动画介绍使用附加
第二板斧就是用的最多的CoreAnimation动画库,简称是CA,所以动画类都是CA开头。所有的动画类都在 QuartzCore 库中,在iOS7之前使用需要#import <QuartzCore/QuartzCore.h>,iOS7之后系统已经将其自动导入了。CoreAnimation动画都是作用在layer上。 先来看下动画类的层级关系:
Haley_Wong
2018/08/22
1.2K0
iOS动画三板斧(二)--CoreAnimation动画介绍使用附加
推荐阅读
相关推荐
实践-跑马灯效果及实现过程解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文