前言
通过阅读本文,您将收获以下知识点
- loopIn(type, numKeyframes)
- loopOut(type, numKeyframes)
- loopInDuration(type, duration)
- loopOutDuration(type, duration)
以及它们各自在不同 type 和 numKeyframes / duration 下的区别;
本文默认您已经具备了 AE 中关键帧(KeyFrame)的基础概念,并且以下的演示都是基于 4 个关键帧(依次从左到右)小车,如下所示

我们先从比较简单 loopOut 开始(loopIn 的思维稍稍有点反人类,但是转过弯来就容易理解了)
一、loopOut
loopOut 的功能:从最后一个关键帧开始循环,直到超过你所设置的时间限制。
首先,我们来看看 loopOut 表达式的形式,它一共由两个参数构成,
- 第一个参数表示 循环的类型(默认是 cycle 类型),
- 第二个参数用于指示 进行循环片段的关键帧帧数(默认是 0,意味着所有关键帧都会被循环)。
loopOut(type="cycle", numKeyframes=0)
1. numKeyframes = 0
实际的效果如图所示


从 Position 和时间的曲线关系可知,小车从左向右的运动是周期性重复(即循环所有关键帧)的,直到到达 Timeline 的终点。

2. numKeyframes = 1
现在我们尝试把 numKeyFrame 设置为 1 ,看看会发生什么


从 Position 和时间的关系图中我们可以看到 loopOut 是在 最后一帧 和 倒数第二帧 之间的 Position 进行循环的,即 N 和 N - 1 的位置(这里的 N 表示关键帧总数,本例为 4)。
同理,我们可以大胆推论,如果 numKeyframes = 2 的话,则是 N 和 N - 2 之间进行循环

上图也印证了我们的推论。
可能有的机智的读者会想:如果 numKeyframes 的值超过范围会发生什么?(即 numKeyframes >= N)
在此我先按下不表,后文稍后会提到。
二、loopIn
loopIn 和 loopOut 虽然函数看起来很类似,但 它是从时间线一开始就会循环,接着某一个时刻到达 第一个关键帧,仍会继续执行(但之后不再循环),直到达到 最后一个关键帧 为止。
loopIn(type="cycle", numKeyframes=0)
1. numKeyframes = 0
我们还是以 cycle 类型、numKeyframes = 0 为例,效果如下

注意:关键帧在时间线上的位置,关键帧前面需要空出一段时间用于 loopIn 循环

对应的 Position 曲线图如下,显然 在遇到第一个关键帧之前,已经执行了两次循环,直到到达最后一个关键帧的 Position 就停止移动。

但是有一点需要 注意,就是如果从时间线开始到第一个关键帧的时间 ( time0),不是第一个关键帧到最后一个关键帧周期时间 (time1) 的 整数倍 的话(即 time0 无法整除 time1),则可能出现以下 Position 不符合预期的情况(起始位置跑到了最后一帧的 Position)


2. numKeyframes = 1
现在我们尝试把 numKeyframes 设置为 1 试试

从位置曲线上,我们很容易看出来,numKeyframes = 1 使得循环仅在 第一个 Position 和 第二个 Position 之间进行

感兴趣的同学可以尝试其他的值,我这里就不具体演示了,总结起来 numKeyframes 的作用就是 “指定进行循环的片段范围:循环片段是层中从第一个关键帧到 numKeyframes+1 关键帧的部分”,默认值 0 表示所有关键帧都循环。
LoopIn 和 LoopOut 选择关键帧范围的顺序刚好相反,前者是正序,后者是逆序
理论上可以在大多数属性上使用循环表达式。但是有些 例外的情况 ——
- 时间轴面板中不能用简单数值表示的属性,例如 源文本属性、路径形状属性 和用于 级别效果的直方图属性;
- 太大的关键帧或持续时间值会被裁剪到最大允许值;
- 值太小会导致一个常量循环。
(未完待续)