Создаем шейп-коробку которая будет автоматически подстраиваться под написанный текст!
В чем суть данного метода?
Если вы часто меняете текст то это очень поможет, ведь при любых изменениях текста (шрифта, положения, анимации и прочих параметров) шейп будет подстраиваться автоматически!
Внимание! Выражения написанные ниже работают начиная с After Effects CC15 и выше! В версиях AE ниже они работать не будут.
Начнем!
- Создайте текстовой слой, и переименуйте его как “currentText” (это требуется чтобы название слоя было всегда одно и тоже)
- Создайте шейп с примерным размером как текст.
- Теперь осталось встроить выражения!
Откройте параметры шейпа и внесите выражения (Alt+клик на часиках чтобы открыть окно ввода выражения).
Всего мы внесем 2 разных выражения в 2 свойства.
Вариант 1
Зависящее от времени (time). Не лучший вариант т.к если на временной шкале у вас есть разница (слой с текстом на пару секунд дальше или ближе относительно шейпа) то шейп будет следовать по времени композиции а не вашего текстового слоя.
Решение: соблюдать тайминг или использовать другие варианты ниже.
Rectangle -> Rectangle Path -> Size:
Основной параметр определения размера шейпа, собственно на нем можно и закончить!
title = thisComp.layer("currentText");
inside_rect = time;
w = title.sourceRectAtTime(inside_rect).width;
h = title.sourceRectAtTime(inside_rect).height;
[w,h]
Rectangle -> Rectangle Path -> Position:
Параметр для определения позиции шейпа (нужен для выравнивания)
title = thisComp.layer("currentText");
inside_rect = time;
w = title.sourceRectAtTime(inside_rect).width/2;
h = title.sourceRectAtTime(inside_rect).height/2;
left = title.sourceRectAtTime(inside_rect).left;
top = title.sourceRectAtTime(inside_rect).top;
[w+left,h+top]
Вариант 2
Зависящее от (time-title.inPoint). Полностью привязан к текстовому слою независимо от разницы времени у слоев. По сути лучший вариант!
Rectangle -> Rectangle Path -> Size:
title = thisComp.layer("currentText");
inside_rect = time-title.inPoint;
w = title.sourceRectAtTime(inside_rect).width;
h = title.sourceRectAtTime(inside_rect).height;
[w,h]
Rectangle -> Rectangle Path -> Position:
title = thisComp.layer("currentText");
inside_rect = time-title.inPoint;
w = title.sourceRectAtTime(inside_rect).width/2;
h = title.sourceRectAtTime(inside_rect).height/2;
left = title.sourceRectAtTime(inside_rect).left;
top = title.sourceRectAtTime(inside_rect).top;
[w+left,h+top]
Вариант 3
А что если не нужно анимировать шейп (за счет аниматоров или еще чего-то) а просто чтобы шейп следовал за изменениями текста?
Данное выражение вам подходит! На нем не работает никакая анимация – только следование за текстом (дабы создавать собственные анимации).
Rectangle -> Rectangle Path -> Size:
title = thisComp.layer("currentText");
inside_rect = (title.outPoint-title.inPoint)/2;
w = title.sourceRectAtTime(inside_rect).width;
h = title.sourceRectAtTime(inside_rect).height;
[w,h]
Rectangle -> Rectangle Path -> Position:
title = thisComp.layer("currentText");
inside_rect = (title.outPoint-title.inPoint)/2;
w = title.sourceRectAtTime(inside_rect).width/2;
h = title.sourceRectAtTime(inside_rect).height/2;
left = title.sourceRectAtTime(inside_rect).left;
top = title.sourceRectAtTime(inside_rect).top;
[w+left,h+top]
А как создать границы?
Если вы хотите добавить границы от текста, то просто создайте внутри шейпа Offset Path и настройте размеры (Amount).
Когда вы создаете границу то желательно добавить еще одно выражение (фиксирует и переносит Anchor Point для внутренних параметров Transform):
Rectangle -> Transform -> Anchor Point:
title = thisComp.layer("currentText");
inside_rect = time; //Ваш любой тип (см. выше)
left = title.sourceRectAtTime(inside_rect).left;
top = title.sourceRectAtTime(inside_rect).top;
offset = content("Offset Paths 1").amount; //Наш Amount у Offset Path
[left-offset,top-offset]
Rectangle -> Transform -> Position:
Привяжите к Anchor Point что выше или используйте этот:
content("Rectangle 1").transform.anchorPoint
Как вы понимаете вариаций можно создать еще больше! Например создавать шейп который будет анимироваться (за счет аниматоров) только по ширине или высоте и так далее.
Лучший вариант
На правах рекламы я хочу прорекламировать свой скрипт который выполняет всё это и не только!
А называется он Auto-Fit to Title | Self-Resizing Boxes into Text Layers
Или же можете написать мне в личку ВК/через этот сайт – будет существенная скидка:)