在iOS开发中使用动画时,可以通过设置动画的duration
、speed
、begintime
、offset
属性,来设置动画的时长、速度、起始时间及起始偏移。
用一个简单的例子来说明各个参数的的作用。动画很简单,一个红色的方块从左移到右边。动画的持续时间是1s,没有重复,效果如下。
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];
做修改以后,效果如下:
与上面相比,三处不同
我们已经看到了这些属性的效果。翻阅文档,发现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在屏幕上的显示位置,一共分三步。
与此类似,要确定sub1ayer1中的time,也要分三步。
begintime
、offset
等属性计算出view layer中的time2begintime
、offset
等属性计算出sublayer中的time3和确定layer的位置相比,确定时间有一些复杂,主要提现在下面两点
CAMediaTiming
协议,就可以作为层级时间系统的一部分。比如CALayer
、CAAnimation
(及其子类CAAnimationGroup
)都可以作为层级时间系统的一部分。begintime
、offset
、speed
等属性。转换的规则也比较复杂,要经历两次转换。从parent time
到active local time
,再到basic local time
。active local time
这次转换是为了处理当前层级的object在父层级的的时间线上的位置,以及当前层级和父层级之间时间流逝速度的关系。
和这次转换相关的属性有beginTime
、speed
以及timeOffset
begin time
begintime
是6s,那么当它父层级的时间变为6s时,子层级才开始计算时间。speed
timeOffset
timeOffset
是5s,那么本地时间的起始就是5s。
从parent time
到active local time
有一个公式,可以用来参考。
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,因此当前是动画展示一半的状态。
repeatCount
及repeatDuration
repeatCount
,那么指定了动画要重复几次。如果指定了repeatDuration
,那么指定了动画重复的时间。autoreverses
根据这些知识,可以解释文章开始时设置参数的效果。
当动画被加到layer上时,动画对应的time space
被加到层级时间系统中,是layer对应的time space
的子层级。
speed
是2,这样子动画中的时间流逝速度时layer中时间流逝速度的2倍。当layer中时间经过0.5s时,动画中时间已经流逝了1s,动画已经完成了。(动画的duration
是1s)addtime
,然后把动画的begintime
设置为addtime+0.3
。这样子当动画被加到layer之后0.3s,layer中的时间是addtime+0.3
,此时动画中的时间才开始计算,之前动画没有开始。offset
为0.5s。当动画开始时,动画对应的time space
的时间是0.5s,对应动画duration
的一半,即滑块位置在屏幕中央。
了解了CAMediaTiming
协议后,可以实现很多动画的效果。
speed
为0即可。autoreverses
属性设置为YES
即可。beginTime
为不同的值即可speed
为0,然后改变动画的offset
即可。苹果已经把工具给我们了,可以做出什么样的产品就看大家的想象力了。
下载说明
☉本站所有源码和资源均由站长亲自测试-绝对保证都可以架设,运营!
☉如源码和资源有损坏或所有链接均不能下载,请告知管理员,
☉本站软件和源码大部分为站长独资,资源购买和收集,放心下载!
☉唯一站长QQ:1004003180 [人格担保-本站注重诚信!]
☉购买建议E-mail:1004003180@qq.com 源码收购 E-mail:1004003180@qq.com
☉本站文件解压密码 【文章内都自带解压密码,每个密码不同!】