Создаем шейп-коробку которая будет автоматически подстраиваться под написанный текст!

Пример:

В чем суть данного метода?

Если вы часто меняете текст то это очень поможет, ведь при любых изменениях текста (шрифта, положения, анимации и прочих параметров) шейп будет подстраиваться автоматически!

Внимание! Выражения написанные ниже работают начиная с After Effects CC15 и выше! В версиях AE ниже они работать не будут.

Начнем!

  1. Создайте текстовой слой, и переименуйте его как “currentText” (это требуется чтобы название слоя было всегда одно и тоже)
  2. Создайте шейп с примерным размером как текст.
  3. Теперь осталось встроить выражения!

Откройте параметры шейпа и внесите выражения (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

Ссылка для покупки на VideoHive.

Или же можете написать мне в личку ВК/через этот сайт – будет существенная скидка:)

В скрипт включено:

36 готовых предустановок для текста

7 типов выражений:

1) Следовать по времени (включая анимацию текста)
2) Полностью фиксированный (не следует за анимацией, реагирует только на изменение текста – дабы самому заанимировать шейп)
3) Фиксированная ширина (включает реакцию на анимацию текста только по высоте)
4) Фиксированная высота (включает реакцию на анимацию текста только по ширине)
5) Вариант 1 с другим экспрешеном: time-title.inPoint
6) Вариант 1 с другим экспрешеном: time-title.outPoint
7) Свой выбор экспрешена: title.sourceRectAtTime(ваш код)


Похожие