Полезные фишки Аfter Effects
Анимация смотрится более интересной, если колебания не просто останавливаются, пусть и плавно, а всё таки колеблются. Для этого можно использовать скрипт.
Конечно я такое не пишу, а копирую и вставляю. Поэтому я оставлю это тут, чтоб посмотреть в случае надобности. А может ещё кому пригодится.
Данное выражение нужно вставить в Expression в параметрах Position, Scale или другие. Таким образом при движении или увеличении масштаба, в ключевом кадре будут колебания.
А вот ещё одно выражение для затухающих колебаний. Предыдущее почему-то не работает с перемещением точки по двум осям. А вот это работает:
Bounce в тексте
Создаем или используем уже готовый текстовой слой.
Заходим в свойства текста: Text -> Animate -> Любой параметр для анимации
Будет создан аниматор, внутри него ваше свойство и селектор (Range Selector по стандарту). Удаляем стандартный селектор и нажимаем добавить новый (меню рядом с аниматором – справа) – Selector -> Expression
Открываем параметры Expression Selector и в Amount добавляем наше выражение.
источник
Ещё вариант bounce для текста
источик
Как заменить файл в композиции с сохранением всех его движений, эффектов и т.д
1) Выделяем слои, которые надо подвергнуть замене
2) из окна проекта тянем нужный файл, которым подменяем источник, зажав при этом Alt.
источник
Пропорциональный виггл
w=wiggle(1,20); [w[0],w[0]]
источник
виггл к одному значению переменной
w = wiggle(2,50); [value[0],value[0],w[1]]
[value[0],value[0],wiggle(1,2)[0]]
источник
разный виггл к двум значениям переменной Position
ww = wiggle(.8,10);
wh = wiggle(.8,1);
[ww[0],wh[1]]
Одновременно wiggle и LoopOut
L = loopOut(type = "pingpong", numKeyframes = 0);
ww = wiggle(.3,10);
wh = wiggle(.3,100);
L + [ww[0],wh[1]] - value
Если нужно сделать разный виггл и ссылаться на слой в композиции с поправкой:
L = loopOut(type = "pingpong", numKeyframes = 0);
ww = wiggle(.3,10);
wh = comp("name-comp").layer("name-layer").effect("name-effect")("Output 1");
L + [ww[0],wh+1780] - value
Как обратиться в expression к другой композиции
comp("name-comp").layer("control").effect("Color font end text")("Color")
Выражение для движения по спирали от края к центру
Применяется к Position
Округление чисел
Например при создании счётчика, чтоб округлить до целого числа
Вставить в слайдер:
Округление со знаком после точки
В source текста вставить expression
parseFloat(effect("Slider Control")("Slider")).toFixed(4)
Автоматический зум вначале и в конце слоя
Для Z
Резкие быстрые движения по Y
Например, для создания глитч-эффекта, путём анимации таким образом цветного слоя
Автоматический размер подложки для текста (субтитров)
Применить выражение к Size шейпа
Ещё вариант
Создать шейп, а над ним текстовый слой
В size шейпа вставить этот код:
Если несколько строк, то к position шейпа можно добавить:
для автоматического выравнивания по вертикали
Wiggle и Loop одновременно
Подходит, например, для точки в эффектах, когда использовать нуль для подобных целей затруднительно
Bounce (отскоки)
источник
Если одно значение меньше Х, тогда выводить другое
Мне нужно было сделать виггл под музыку. Однако музыка была не всегда. При этом когда музыки не было мне нужно было, чтоб слой шатался при постоянном виггл.
Изменение размера шейпов с одной стороны (сбоку) через Size с сохранением пропорции Roundness
В Anchor Point шейпа написать выражение
Слева направо
w = content("Rectangle 1").content("Rectangle Path 1").size[0];
[w/2, value[0]]
w - слева направо
-w - справа налево
h = content("Rectangle 1").content("Rectangle Path 1").size[1];
[value[0], -h/2];
h - сверху вниз
-h - снизу ввех
Плавная смена цвета
Color Balance (HLS) - анимация Hue
Условия
Если это не так, то есть a меньше b, то выводится вторая строка
так же можно использовать другие варианты
< - меньше
== - равно
Для чекбокса (галочки)
Например, нужно отображать слой или скрывать при нажатии на галочку.
В параметре прозрачности (opacity) прописать:
if (путь до эффекта чекбокс == 1) 0 else 100;
то есть, если галочка проставлена (== 1), то значение параметра прозрачности будет = 0. а если галочка не проставлена, то = 100
живой пример со ссылкой на слой settings, эффект "Checkbox" с названием "full image" в композиции "slide-show"
if (comp("slide-show").layer("settings").effect("full image")("Checkbox") == 1) 0 else 100;
Внутренняя обводка для шейпа
Add --- Offset Paths
Прикрепить параметр Amount к Stroke Width шейпа и дописать /-2
источник
Прозрачность слоя относительно положения камеры
Выражение применяется к Opacity 3д слоя
источник
Обратное действие в зависимости от скорости
Например на Rotatiion повесить следующий expression
Он ссылается на позицию слоя path
Счётчик с округлением и дополнительными символами
В source text прописать следующее
Счётчик с разделением на разряды
Применить следующее выражение к source text для привязки к слайдеру
Теперь тысячные будут разделяться пробелом
Счётчик с постоянным количеством цифр
Применить следующее выражение к source text для привязки к слайдеру
zerosAmount - это количество цифр. В данном примере цифры будут выглядеть как 001 002 020, то есть если в числе меньше 3 цифр, то будут добавляться нули
Счётчик для миллионов
Применить следующее выражение к source text для привязки на этот раз к Angle control
Зацикленный wiggle для разных значений
Если значения 2, например, без оси Z, тогда соответствующий параметр - wz - следует убрать как минимум из последней строчки из выражения
Для одного значения, например, для Rotation, выражение может выглядеть так:
loopTime - это время цикла в секундах. То есть длина композиции
Эффект управления количеством кадров в секунду (FPS)
Effects - Time - Posterize Time
Нужно применить стиль слоя Inner Glow со следующими параметрами:
Blend mode: normal
Technique: precise
Size: 6
Изменение параметра одного значения, относительно другого
Есть какой-то меняющийся параметр, например Position, Scale или что-либо ещё. Для примера возьмём Scale, который меняется от 0 до 100
Задача: изменять другой параметр, например Slider Control, относительного того параметра Scale. Причём не просто привязав к тому Scale и меняя Slider Control с 0 до 100, а через интерполяцию. То есть чтоб, например, если Scale = 0, то Slider Control пусть будет = 25. И когда Scale = 100, то Slider Control пусть будет = 65
Таким образом можно менять нужное значение относительно другого значения в заданном диапазоне без использования ключевых точек
Для этого нужно в параметре изменяемого значения прописать следующее выражение:
Для конкретно текущего примера:
Вместо linear можно easeOut
источник
Постоянная ширина обводки, независимо от scale
Прописать выражение в «Stroke Width»:
Привязка положения эффекта к слою
Применять следующее выражение к эффекту, где используется Position. Например, Radial Blur -- Center, а так же Start и End в Gradient Ramp или в Offset Turbulence в Fractal Noise
Таким образом положение эффекта не будет менять при перемещении слоя. Обычно чтоб такого достичь приходилось делать прекомпоз
Печатающийся текст с мигающим курсором
Быстрый вариант с маркерами
В Source текстового слоя вставить выражение
При этом создать 4 маркера 'cursorStart', 'textStart', 'textStop', 'cursorStop'.
Вариант со слайдером ниже. Можно регулировать скорость набора текста, останавливать печатание.
В Source текстового слоя вставить выражение
Создать Slider Control с именем txtComplete. А так же два маркера 'cursorStart', 'cursorStop'.
Слайдером регулируется количество текста от 0 до 100. Маркерами регулируется начало и конец мигания курсора
cursor="|"; - символ для мигающего курсора
источник
Обратный отсчёт времени (Таймер времени)
Создать текстовый слой, добавить в него Слайдер
В source текстового слоя прописать выражение
Далее настраивать отсчёт через ключевые кадры слайдера. Можно делать как обратный отсчёт, так и движение времени вперёд.
Если часы не нужны, а только минуты и секунды, из выражения следует убрать
источник
n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time){
n--;
}
}
if (n == 0){
t = 0;
}
else{
t = time - key(n).time;
}
if (n > 0){
v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
amp = .025;
freq = 2.0;
decay = 3.0;
value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
}
else{
value;
}
Данное выражение нужно вставить в Expression в параметрах Position, Scale или другие. Таким образом при движении или увеличении масштаба, в ключевом кадре будут колебания.
А вот ещё одно выражение для затухающих колебаний. Предыдущее почему-то не работает с перемещением точки по двум осям. А вот это работает:
amp = .1;
freq = 1.0;
decay = 5.0;
n = 0;
time_max = 4;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time){
n--;
}}
if (n == 0){ t = 0;
}else{
t = time - key(n).time;
}
if (n > 0 && t < time_max){
v = velocityAtTime(key(n).time - thisComp.frameDuration/10);
value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t);
}else{value}
Bounce в тексте
Создаем или используем уже готовый текстовой слой.
Заходим в свойства текста: Text -> Animate -> Любой параметр для анимации
Будет создан аниматор, внутри него ваше свойство и селектор (Range Selector по стандарту). Удаляем стандартный селектор и нажимаем добавить новый (меню рядом с аниматором – справа) – Selector -> Expression
Открываем параметры Expression Selector и в Amount добавляем наше выражение.
freq = 1; //частота / frequency
decay = 6; //распад / decay
duration = 0.25; //продолжительность / duration
retard = textIndex*thisComp.frameDuration*1;
t = time - (inPoint + retard);
startVal = [100,100,100];
endVal = [0,0,0];
if (t < duration){
linear(t,0,duration,startVal,endVal);
}else{
amp = (endVal - startVal)/duration;
w = freq*Math.PI*2;
endVal + amp*(Math.sin((t-duration)*w)/Math.exp(decay*(t-duration))/w);
}
источник
Ещё вариант bounce для текста
delay = 0.1; myDelay = delay*textIndex; t = (time - inPoint) - myDelay; if (t >= 0){ freq =1; amplitude = 150; decay = 6; s = amplitude*Math.cos(freq*t*2*Math.PI)/Math.exp(decay*t); [s,s] }else{ value }
источик
Как заменить файл в композиции с сохранением всех его движений, эффектов и т.д
1) Выделяем слои, которые надо подвергнуть замене
2) из окна проекта тянем нужный файл, которым подменяем источник, зажав при этом Alt.
источник
Пропорциональный виггл
w=wiggle(1,20); [w[0],w[0]]
источник
виггл к одному значению переменной
w = wiggle(2,50); [value[0],value[0],w[1]]
[value[0],value[0],wiggle(1,2)[0]]
источник
разный виггл к двум значениям переменной Position
ww = wiggle(.8,10);
wh = wiggle(.8,1);
[ww[0],wh[1]]
Одновременно wiggle и LoopOut
L = loopOut(type = "pingpong", numKeyframes = 0);
ww = wiggle(.3,10);
wh = wiggle(.3,100);
L + [ww[0],wh[1]] - value
Если нужно сделать разный виггл и ссылаться на слой в композиции с поправкой:
L = loopOut(type = "pingpong", numKeyframes = 0);
ww = wiggle(.3,10);
wh = comp("name-comp").layer("name-layer").effect("name-effect")("Output 1");
L + [ww[0],wh+1780] - value
Как обратиться в expression к другой композиции
comp("name-comp").layer("control").effect("Color font end text")("Color")
Выражение для движения по спирали от края к центру
Применяется к Position
//Moves things in a spiral (apply to position)
center=[thisComp.width/2,thisComp.height/2];
rMax = 240; //maximum radius
decay = 0.3; //decay
freq = 6; //frequency
aStart = 0; //start angle offset
aRate = 220; //rotation rate
offsetFactor = 1000; //smoothness
r = rMax/Math.exp(time*decay);
a = degreesToRadians(aStart + aRate*time);
offset = (r/offsetFactor)*Math.sin(freq*time*Math.PI*2);center + [Math.cos(a),Math.sin(a)]*(r + offset);
Округление чисел
Например при создании счётчика, чтоб округлить до целого числа
Вставить в слайдер:
Math.round(value)
Округление со знаком после точки
В source текста вставить expression
parseFloat(effect("Slider Control")("Slider")).toFixed(4)
Автоматический зум вначале и в конце слоя
//Snap zoom in and out: apply to scale
snapScale = 1000; //percent of scale to zoom
trans = 4; // transition time in frames
trans = trans * thisComp.frameDuration;
inTrans = easeOut(time, inPoint, inPoint + trans, [snapScale,snapScale], [0,0]);
outTrans = easeIn(time, outPoint, outPoint - trans, [0,0], [snapScale, snapScale]);
value+ inTrans + outTrans
Для Z
zoom = 5000; //distance to zoom
trans = 4; // transition time in frames
trans = trans * thisComp.frameDuration;
inTrans = easeIn(time, inPoint, inPoint + trans, [0,0,zoom], [0,0,0]);
outTrans = easeOut(time, outPoint, outPoint - trans*2, [0,0,0], [0,0,zoom]);
value+ inTrans - outTrans
Резкие быстрые движения по Y
Например, для создания глитч-эффекта, путём анимации таким образом цветного слоя
// Y Axis Jitter
probability = 8 ; //higher is less likely
pos = 50;
val = random(-probability-2, 1);
m = clamp(val, 0, 1);
y = wiggle(10, pos*m)-position;
value + [0, y[1]]
Автоматический размер подложки для текста (субтитров)
Применить выражение к Size шейпа
textLayer = thisComp.layer("text");//наш текстовый слой bbox = textLayer.sourceRectAtTime(time+.01,true);//bounding box вокруг текста [bbox.width*textLayer.scale[0]/100,bbox.height*textLayer.scale[1]/100]+[50,50]
Ещё вариант
Создать шейп, а над ним текстовый слой
В size шейпа вставить этот код:
margin_width = 60;
margin_height = 40;
text_width = thisComp.layer(index-1).sourceRectAtTime().width;
text_height = thisComp.layer(index-1).sourceRectAtTime().height;
box_width = text_width + margin_width*2;
box_height = text_height + margin_height*2;
[box_width, box_height]
Если несколько строк, то к position шейпа можно добавить:
x = value[0];
y = content("Rectangle 1").content("Rectangle Path 1").size[1]/2;
[x,y]
для автоматического выравнивания по вертикали
Wiggle и Loop одновременно
Подходит, например, для точки в эффектах, когда использовать нуль для подобных целей затруднительно
L = loopOut ("pingpong" ) ; //you can also put "pingpong" instead of "cycle" for your loop
W = wiggle ( 1, 200 ) ; //3 is the times per second, 30 is the number of pixels it will vacillate
L + W - value ;
Bounce (отскоки)
e = .7; //высота отскока
nMax = 3; //количество отскоков
g = 5000; //гравитация
n = 0;
if (numKeys > 0){
n = nearestKey(time).index;
if (key(n).time > time) n--;
}
if (n > 0){
t = time - key(n).time;
v = -velocityAtTime(key(n).time - .001)*e;
vl = length(v);
if (value instanceof Array){
vu = (vl > 0) ? normalize(v) : [0,0,0];
}else{
vu = (v < 0) ? -1 : 1;
}
tCur = 0;
segDur = 2*vl/g;
tNext = segDur;
nb = 1; // number of bounces
while (tNext < t && nb <= nMax){
vl *= e;
segDur *= e;
tCur = tNext;
tNext += segDur;
nb++
}
if(nb <= nMax){
delta = t - tCur;
value + vu*delta*(vl - g*delta/2);
}else{
value
}
}else
value
источник
Если одно значение меньше Х, тогда выводить другое
Мне нужно было сделать виггл под музыку. Однако музыка была не всегда. При этом когда музыки не было мне нужно было, чтоб слой шатался при постоянном виггл.
t = comp("name-comp").layer("music").effect("music")("param"); if (comp("name-comp").layer("music").effect("music")("param") < 1) t =5; t; wiggle(1,t/5)Если значение музыки меньше comp("name-comp").layer("music").effect("music")("param"), тогда выводим 5. если нет, выводим 20 или больше
Изменение размера шейпов с одной стороны (сбоку) через Size с сохранением пропорции Roundness
В Anchor Point шейпа написать выражение
Слева направо
w = content("Rectangle 1").content("Rectangle Path 1").size[0];
[w/2, value[0]]
w - слева направо
-w - справа налево
h = content("Rectangle 1").content("Rectangle Path 1").size[1];
[value[0], -h/2];
h - сверху вниз
-h - снизу ввех
Плавная смена цвета
Color Balance (HLS) - анимация Hue
Условия
if ( a > b ) {
"A Wins!";
} else {
"B Wins!";
}
Если a больше b, то выводится первая строкаЕсли это не так, то есть a меньше b, то выводится вторая строка
так же можно использовать другие варианты
< - меньше
== - равно
Для чекбокса (галочки)
Например, нужно отображать слой или скрывать при нажатии на галочку.
В параметре прозрачности (opacity) прописать:
if (путь до эффекта чекбокс == 1) 0 else 100;
то есть, если галочка проставлена (== 1), то значение параметра прозрачности будет = 0. а если галочка не проставлена, то = 100
живой пример со ссылкой на слой settings, эффект "Checkbox" с названием "full image" в композиции "slide-show"
if (comp("slide-show").layer("settings").effect("full image")("Checkbox") == 1) 0 else 100;
Внутренняя обводка для шейпа
Add --- Offset Paths
Прикрепить параметр Amount к Stroke Width шейпа и дописать /-2
источник
Прозрачность слоя относительно положения камеры
Выражение применяется к Opacity 3д слоя
startFade = 500; // Начало затухания слоя 500 пикселей до камеры
endFade = 1500; // Конец затухания слоя 1500 пикселей до камеры
try
{ // Проверка, есть ли камера в композиции
C = thisComp.activeCamera.toWorld([0,0,0]);
}
catch(err)
{ // Если камеры нет, то симулируем камеру с фокусным расстоянием 50мм
w = thisComp.width * thisComp.pixelAspect;
z = (w/2)/Math.tan(degreesToRadians(19.799));
C = [0,0,-z];
}
P = toWorld(anchorPoint);
d = length(C,P);
linear(d,startFade,endFade,100,0)
источник
Обратное действие в зависимости от скорости
Например на Rotatiion повесить следующий expression
thisComp.layer("path").transform.position.velocity[0]/-200;
Он ссылается на позицию слоя path
Счётчик с округлением и дополнительными символами
В source text прописать следующее
Math.floor(effect("Slider Control")("Slider")) + " руб."
Счётчик с разделением на разряды
Применить следующее выражение к source text для привязки к слайдеру
num = parseFloat(effect("Slider Control")("Slider")).toFixed(0);
str = isNaN(num) ? "" : (num * 1 + "");
str.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');
Теперь тысячные будут разделяться пробелом
Счётчик с постоянным количеством цифр
Применить следующее выражение к source text для привязки к слайдеру
zerosAmount = 3;
var slider = effect("Slider Control")("Slider");
function padStart(string, targetLength, character) {
string = (string instanceof String) ? string : string.toString();
targetLength = targetLength >> 0;
character = character || ' ';
while (string.length < targetLength) {
string = character + string;
}
return string;
};
if (slider >= 0) {
zeroAmount = zerosAmount + 1;
paddedString = padStart(parseFloat(slider.value).toFixed(0), zerosAmount, '0');
}
else {
paddedString = '-0'+padStart(parseFloat(slider.value).toFixed(0)*-1, zerosAmount, '0');
}
paddedString;
zerosAmount - это количество цифр. В данном примере цифры будут выглядеть как 001 002 020, то есть если в числе меньше 3 цифр, то будут добавляться нули
Счётчик для миллионов
Применить следующее выражение к source text для привязки на этот раз к Angle control
number = Math.round(effect("Angle Control")("Angle")/360);
n="" + number;
s="";
for(i=0, l=n.length; i<l; i++){
if(s && s!="-" && (l-i)%3 ==0)
s+=" ";
s += n[i];
}
s;
Зацикленный wiggle для разных значений
loopTime = 3;
t = time % loopTime;
wx1 = wiggle(.3, 150, 1, .5, t);
wx2 = wiggle(.3, 150, 1, .5, t - loopTime);
wy1 = wiggle(.3, 160, 1, .5, t);
wy2 = wiggle(.3, 160, 1, .5, t - loopTime);
wz1 = wiggle(.3, 500, 1, .5, t);
wz2 = wiggle(.3, 500, 1, .5, t - loopTime);
linear(t, 0, loopTime, [wx1[0],wy1[1],wz1[2]], [wx2[0],wy2[1],wz2[2]])
Если значения 2, например, без оси Z, тогда соответствующий параметр - wz - следует убрать как минимум из последней строчки из выражения
Для одного значения, например, для Rotation, выражение может выглядеть так:
loopTime = 15;
t = time % loopTime;
wx1 = wiggle(.1, 20, 1, .5, t);
wx2 = wiggle(.1, 20, 1, .5, t - loopTime);
linear(t, 0, loopTime, [wx1], [wx2])
loopTime - это время цикла в секундах. То есть длина композиции
Эффект управления количеством кадров в секунду (FPS)
Effects - Time - Posterize Time
Мягкие края для текста и других слоёв
Делать мягкие края можно разными способами. Я у Энрю Крамера увидел интересный вариант со стилем слояНужно применить стиль слоя Inner Glow со следующими параметрами:
Blend mode: normal
Technique: precise
Size: 6
Изменение параметра одного значения, относительно другого
Есть какой-то меняющийся параметр, например Position, Scale или что-либо ещё. Для примера возьмём Scale, который меняется от 0 до 100
Задача: изменять другой параметр, например Slider Control, относительного того параметра Scale. Причём не просто привязав к тому Scale и меняя Slider Control с 0 до 100, а через интерполяцию. То есть чтоб, например, если Scale = 0, то Slider Control пусть будет = 25. И когда Scale = 100, то Slider Control пусть будет = 65
Таким образом можно менять нужное значение относительно другого значения в заданном диапазоне без использования ключевых точек
Для этого нужно в параметре изменяемого значения прописать следующее выражение:
linear(time, t1, t2, val1, val2)
Для конкретно текущего примера:
linear(thisComp.layer("name-layer").transform.scale[0], 0, 100, 25, 60)
Вместо linear можно easeOut
источник
Постоянная ширина обводки, независимо от scale
Прописать выражение в «Stroke Width»:
value / length(toComp([0,0]), toComp([0.7071,0.7071])) || 0.001;
Привязка положения эффекта к слою
Применять следующее выражение к эффекту, где используется Position. Например, Radial Blur -- Center, а так же Start и End в Gradient Ramp или в Offset Turbulence в Fractal Noise
toComp(value)
Таким образом положение эффекта не будет менять при перемещении слоя. Обычно чтоб такого достичь приходилось делать прекомпоз
Печатающийся текст с мигающим курсором
Быстрый вариант с маркерами
В Source текстового слоя вставить выражение
//put this expression for the 'Source Text' value on your text layer, and add 4 markers on the layer : 'cursorStart', 'textStart', 'textStop', 'cursorStop'
cursor="|";
cursorBlink = 1; //seconds
txt = value;
timeIn = thisLayer.inPoint; //seconds
txtSize = text.sourceText.length;
animateText = true;
showCursor = true;
//check if required markers exists
try{
textStart = marker.key('textStart').time;
textStop = marker.key('textStop').time;
}catch(e){
AnimateText = false;
}
//check if required markers exists
try{
cursorStart = marker.key('cursorStart').time;
cursorStop = marker.key('cursorStop').time;
}catch(e){
showCursor = false;
}
if (animateText){
duration = textStop - textStart; //type-on duration in seconds
txtIdx = linear(time, textStart, textStop, 0, txtSize);
txt = substr(0,txtIdx)
}
if (showCursor){
F = Math.round( (time + cursorStart) % cursorBlink );
if ( (time > cursorStart) && (time < cursorStop) && (F==1) ) {
txt += cursor;
}
}
txt;
При этом создать 4 маркера 'cursorStart', 'textStart', 'textStop', 'cursorStop'.
Вариант со слайдером ниже. Можно регулировать скорость набора текста, останавливать печатание.
В Source текстового слоя вставить выражение
txt = value;
timeIn = thisLayer.inPoint; //seconds
txtSize = text.sourceText.length;
cursor="|";
cursorBlink = 1; //seconds
txtComplete = 100; //percents - add a slider 'txtComplete' on your layer to animate this value
animateText = true;
showCursor = true;
//check if required markers exists
try{
txtComplete = effect("txtComplete")("Slider");
}catch(e){
AnimateText = false;
}
//check if required markers exists
try{
cursorStart = marker.key('cursorStart').time;
cursorStop = marker.key('cursorStop').time;
}catch(e){
showCursor = false;
}
if (animateText){
txtIdx = txtSize / 100 * txtComplete;
txt = substr(0,txtIdx)
}
if (showCursor){
F = Math.round( (time + cursorStart) % cursorBlink );
if ( (time > cursorStart) && (time < cursorStop) && (F==1) ) {
txt += cursor;
}
}
txt;
Создать Slider Control с именем txtComplete. А так же два маркера 'cursorStart', 'cursorStop'.
Слайдером регулируется количество текста от 0 до 100. Маркерами регулируется начало и конец мигания курсора
cursor="|"; - символ для мигающего курсора
источник
Обратный отсчёт времени (Таймер времени)
Создать текстовый слой, добавить в него Слайдер
В source текстового слоя прописать выражение
t=parseInt(effect("Slider Control")("Slider")); s=t; m=t; h=t; while (s>(60-1)) s-=60; while (m>(3600-1)) m-=3600; m=Math.floor(m/60) while (h>(60*60*24-1)) h-=60*60*24; h=Math.floor(h/60/60) FixLen(h)+":"+FixLen(m)+":"+FixLen(s); function FixLen (input) { numDigits = 2; out=input.toString(); while (out.length < numDigits) out = "0" + out; return out; }
Далее настраивать отсчёт через ключевые кадры слайдера. Можно делать как обратный отсчёт, так и движение времени вперёд.
Если часы не нужны, а только минуты и секунды, из выражения следует убрать
FixLen(h)+":"+
источник