В этом видеоуроке мы изучим loopIn и loopOut, луп свойства Path, loopIn и loopOut вместе, луп композиции через time-remap, луп фона, бесконечное движение фона.

Файл проекта вы можете скачать в группе ВК, в этом посте: https://vk.com/creativetuts?w=wall-72222266_237%2Fall
P.S. подписывайся на группу, там много интересного

Таймкоды (Timecodes):
00:00 — loopOut, cycle
04:51 — loopIn
06:05 — pingpong
08:24 — continue
09:45 — offset
10:58 — continue vs offset
12:24 — Второй аргумент экспрешена лупа (Second argument of loop expression)
14:51 — loopOutDuration, loopInDuration
15:44 — loopOut и loopIn вместе (loopOut & loopIn together)
20:29 — Луп свойства Path (Looping path)
22:42 — Луп композиции (Looping composition)
24:52 — Бесконечное движение фона (Loop Background)

Виды

• loopOut();

• loopIn();

• loopOutDuration();

• loopInDuration();

loopOut(); — Цикл начинается после последнего ключевого кадра и заканчивается на конце слоя.

loopIn(); — Цикл начинается на начале слоя и заканчивается на последнем ключевом кадре.

Аргументы

loopIn(type="cycle", numKeyframes=0)

1-ый аргумент — тип цикла.

2-ой аргумент — количество кадров которое будет использоваться для зацикленной анимации.

loopOutDuration и loopInDuration

Второй аргумент — это длительность которую нужно брать для цикла, в секундах.

Типы

Cycles — Луп по умолчанию. После последнего ключевого кадра, анимация начинается заново от первого ключевого кадра до последнего, и так до конца слоя.

Pingpong — Луп, в котором анимация идет от первого ключа до последнего, затем обратно от последнего до первого, а потом снова от первого до последнего.

Offset — Cоздаются циклы и каждый последующий цикл смещается на разницу значения свойства между вторым и первым ключевыми кадрами.

Continue — Данный аргумент не создает новых циклов. Он вычисляет с какой скоростью и в каком направлении слой подходит ко второму ключевому кадру, а затем с той же скоростью и в том же направлении продолжает двигаться.

Зацикленный Path

valueAtTime(time%key(numKeys).time)

Другой пример:

try{
timeStart = thisProperty.key(1).time; // начало - первый кифрэйм
duration = thisProperty.key(thisProperty.numKeys).time-timeStart; //вычисляем длительность
pingPong = true; //если пингпонг не нужен то false
quant=Math.floor((time-timeStart)/duration); //считаем номер цикла
if(quant<0) quant = 0 //не допускаем отрицательных номеров
if(quant%2 == 1 && pingPong == true){ //если цикл нечетный и пингпонг включен
t = 2timeStart+ (quant+1)duration - time; //предлагаю самим понять почему так
}
else{ //работает если пингпонг выключен или если цикл нечетный
t = time-quant*duration;
}
}
catch(err){
t = time;
}
thisProperty.valueAtTime(t)

Источник: https://aexpressions.ru/expressions/loop/loopout-path-ping-pong/

LoopIn & loopOut вместе

if (time < key(1).time) {
loopIn("cycle");
} else {
loopOut("cycle");
}

Другой пример:

loopIn("cycle") + loopOut("cycle") - value

Если мы хотим использовать пинг-понг:

loopIn("pingpong") + loopOut("pingpong")
- value

Луп с одинаковым первым и последним состоянием

Используем луп типа Cycle, но только убеждаемся в том, чтобы первый и последнее состояние объекта были одинаковыми.

Луп композиции с Time-Remap

Используем луп типа Cycle, но только убеждаемся в том, чтобы первый и последний кадр пре-композа были одинаковыми.

Луп фона

Используем эффект Offset