Изменение текстового контента

Текстовые элементы в Lottie представляют собой результат экспорта из Adobe After Effects через плагин Bodymovin. Внутри JSON-структуры анимации текст хранится не как статический SVG или DOM-узел, а как отдельный тип слоя с описанием параметров рендеринга.

Основная структура текстового слоя включает:

  • t — содержимое текстового узла
  • f — имя шрифта
  • s — размер шрифта
  • fc — цвет
  • j — выравнивание
  • lh — межстрочный интервал
  • sw, sc — параметры обводки
  • a — дополнительные трансформации текста

После инициализации анимации Lottie Web преобразует эти данные в внутренние объекты рендера, которые уже не всегда напрямую связаны с исходным JSON.

Ключевая особенность: текстовые слои не являются DOM-элементами, а существуют внутри canvas/SVG/WebGL-рендера, что определяет способы их изменения.


Особенности изменения текстового контента

Текст в Lottie делится на две категории:

  • Статический текст — фиксируется при экспорте и не предназначен для изменения
  • Динамический текст — может быть изменён программно через API или модификацию структуры анимации

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


Изменение текста через экземпляр анимации

Наиболее прямой способ изменения текстового содержимого основан на доступе к внутреннему рендереру Lottie Web.

После создания экземпляра анимации через lottie.loadAnimation становится доступен объект анимации, внутри которого содержатся слои рендера.

Типовая структура доступа:

  • animation.renderer.elements — массив визуальных элементов
  • текстовые элементы имеют тип TextElement или аналогичную реализацию в зависимости от версии рендерера

Каждый текстовый элемент содержит метод обновления документа:

textElement.updateDocumentData({ t: "новый текст" });

Этот метод обновляет внутреннюю модель текста без необходимости перезапуска анимации.

В некоторых версиях используется прямое обновление свойства:

textElement.textProperty.currentData.t = "новое значение";
textElement.textProperty.updateDocumentData();

Поведение зависит от версии lottie-web и типа рендерера (canvas или SVG).


Поиск текстовых элементов внутри анимации

Так как Lottie не предоставляет официального стабильного API для прямого доступа к слоям, текстовые элементы извлекаются через обход внутренней структуры:

  • обход renderer.elements
  • фильтрация по типу TextElement
  • проверка наличия updateDocumentData

Общая логика поиска:

animation.renderer.elements.forEach(el => {
  if (el.updateDocumentData && el.textProperty) {
    el.updateDocumentData({ t: "обновлённый текст" });
  }
});

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


Модификация JSON до инициализации анимации

Другой фундаментальный способ изменения текста заключается в редактировании JSON-структуры до передачи её в lottie.loadAnimation.

В этом случае текст изменяется на уровне исходных данных:

animationData.layers.forEach(layer => {
  if (layer.td && layer.t) {
    layer.t.d.k.forEach(textKeyframe => {
      textKeyframe.s.t = "новый текст";
    });
  }
});

Здесь:

  • layer.td указывает на текстовый слой
  • d.k содержит ключевые кадры текста
  • s.t хранит строковое значение

Такой подход гарантирует предсказуемость, поскольку текст сразу становится частью анимационной модели до рендера.


Динамические текстовые слои в Bodymovin

При экспорте из After Effects текст может быть настроен как динамический через выражения или параметры контроллеров.

В Lottie Web это отражается в JSON как:

  • выражения, завязанные на expr
  • ссылки на контроллеры значений
  • параметризованные текстовые поля

В таких случаях текст может зависеть от внешнего состояния и обновляться при изменении данных анимации.

Пример логики:

  • текст привязан к параметру композиции
  • изменение параметра приводит к перерасчёту текстового слоя

Обновление текста без перезапуска анимации

Одним из критических свойств Lottie Web является возможность обновления визуальных элементов без повторной загрузки JSON.

Механизм обновления включает:

  • изменение внутренней модели слоя
  • инвалидацию текущего кадра
  • перерасчёт рендера на следующем тикe

После вызова updateDocumentData или аналогичного метода:

  • текущий кадр сохраняется
  • анимация продолжает проигрываться
  • текст обновляется синхронно с рендером

Ограничения текстовой модели Lottie

Текстовая система имеет ряд архитектурных ограничений:

  • отсутствие полноценного DOM-текста
  • ограниченная поддержка шрифтовых fallback-механизмов
  • невозможность произвольного форматирования внутри строки (например, частичное жирное выделение)
  • зависимость от шрифтов, встроенных в рендер или подключённых отдельно

Также важной особенностью является то, что изменение текста не всегда приводит к перерасчёту геометрии слоя, если он заранее зафиксирован в композиции.


Поведение при SVG и Canvas рендере

Разные рендереры Lottie Web обрабатывают текст по-разному.

SVG renderer

  • текст представлен как <text> элементы
  • возможна частичная работа с DOM-подобной структурой
  • обновление может быть связано с изменением атрибутов SVG

Canvas renderer

  • текст рисуется через CanvasRenderingContext2D
  • обновление требует перерисовки кадра
  • отсутствует доступ к DOM-структуре

SVG-режим обеспечивает более прозрачную структуру текста, тогда как Canvas даёт более высокую производительность при сложных сценах.


Работа с многострочным текстом

Многострочные текстовые блоки в Lottie кодируются через:

  • lh — line height
  • символы переноса строки \r или \n
  • массивы текстовых сегментов

Изменение текста с переносами требует сохранения структуры форматирования, иначе может нарушиться компоновка слоя.

Пример обновления:

textElement.updateDocumentData({
  t: "Первая строка\nВторая строка"
});

При этом расчёт высоты блока зависит от параметров шрифта и межстрочного интервала.


Шрифтовая зависимость и подмена текста

Текстовые элементы строго зависят от доступности шрифтов:

  • при отсутствии шрифта используется fallback
  • метрики могут изменяться, влияя на позиционирование
  • текст может выходить за пределы маски слоя

В Lottie Web отсутствует автоматическая система замены шрифтов с сохранением точной геометрии, что влияет на предсказуемость изменения текстового контента.


Пересборка слоя после изменения текста

При изменении текста внутренний рендерер выполняет:

  • пересчёт glyph layout
  • обновление bounding box слоя
  • перерасчёт трансформаций при необходимости

В сложных композициях с масками и parent-constraints изменение текста может приводить к изменению всей сцены, так как текст влияет на геометрию слоя.


Управление текстом через внешние состояния

Распространённая архитектура заключается в связывании текстовых слоёв с внешними данными:

  • состояние приложения
  • API-ответы
  • пользовательский ввод

В этом случае обновление текста реализуется как синхронизация состояния и Lottie-слоя через повторное применение updateDocumentData или полное обновление JSON-структуры слоя.

Такой подход позволяет рассматривать текстовые элементы как реактивные узлы внутри анимационной сцены, несмотря на отсутствие встроенной реактивной системы в Lottie Web.