Воспроизведение определенных участков

Работа с воспроизведением отдельных участков анимации в Lottie Web строится вокруг управления диапазонами кадров, маркерами и динамического изменения текущего состояния проигрывания. Библиотека предоставляет низкоуровневые методы, позволяющие запускать не всю композицию целиком, а строго заданные фрагменты, что особенно важно для интерфейсных анимаций, интерактивных элементов и сложных состояний UI.

Каждая Lottie-анимация представляет собой последовательность кадров, определяемую свойствами композиции. Внутри объекта анимации доступны ключевые параметры:

  • firstFrame — начальный кадр композиции
  • totalFrames — общее количество кадров
  • внутренний текущий указатель воспроизведения

Работа с участками анимации базируется на указании диапазона в формате:

[startFrame, endFrame]

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

При этом важно учитывать, что Lottie Web интерпретирует диапазоны либо как кадры, либо как процентные значения (в зависимости от параметров вызова метода), что требует явного указания режима интерпретации.

Метод playSegments

Основной инструмент воспроизведения фрагментов — метод:

animation.playSegments(segments, forceFlag)

Структура параметров

segments может принимать:

  • массив из двух чисел [start, end]
  • массив массивов для очереди сегментов [[s1, e1], [s2, e2]]

forceFlag определяет поведение очереди:

  • true — принудительное прерывание текущего воспроизведения и запуск нового сегмента
  • false — добавление сегмента в очередь

Принцип работы

При вызове playSegments движок Lottie:

  1. Устанавливает текущую позицию на startFrame
  2. Сбрасывает внутренний прогресс сегмента
  3. Запускает воспроизведение до endFrame
  4. При достижении конца сегмента либо останавливается, либо переходит к следующему сегменту в очереди

Этот механизм позволяет строить цепочки анимаций без необходимости разделять JSON-композицию на отдельные файлы.

Пример логики сегментного воспроизведения

Сегментная модель особенно эффективна в интерфейсах с состояниями:

  • загрузка
  • успех
  • ошибка
  • ожидание

Каждое состояние может быть выражено отдельным диапазоном кадров внутри одной композиции.

Очереди сегментов

Передача массива массивов позволяет формировать последовательность воспроизведения:

animation.playSegments([[0, 30], [30, 60], [60, 90]], true)

В этом случае Lottie последовательно проигрывает:

  • первый участок
  • затем второй
  • затем третий

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

Ключевым аспектом является отсутствие автоматического возврата к началу композиции после завершения очереди — управление состоянием остаётся за логикой приложения.

Прерывание текущего воспроизведения

Параметр forceFlag = true используется для мгновенного переключения между сегментами.

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

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

Это критично для интерфейсов с высокой частотой событий, например:

  • hover-анимации
  • переключение вкладок
  • реакция на пользовательский ввод

Без принудительного режима возможна задержка между состояниями из-за очереди сегментов.

Использование маркеров композиции

Помимо числовых диапазонов, Lottie поддерживает именованные маркеры, создаваемые в After Effects при экспорте через Bodymovin.

Маркер представляет собой именованную точку или диапазон внутри таймлайна, доступную через API анимации:

animation.playSegments('markerName', true)

или

animation.goToAndPlay('markerName', true)

Преимущества маркеров

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

Маркерная модель фактически абстрагирует кадровую систему, переводя управление в именованные логические блоки.

Работа с goToAndPlay и goToAndStop

Для более точного контроля используется сочетание методов:

goToAndPlay

animation.goToAndPlay(frame, isFrame)

Позволяет:

  • переместить воспроизведение на конкретный кадр или маркер
  • запустить анимацию с этой точки

goToAndStop

animation.goToAndStop(frame, isFrame)

Используется для установки статичного состояния без воспроизведения.

Режим интерпретации

Параметр isFrame определяет:

  • true — значение трактуется как кадр
  • false — значение трактуется как время (в секундах)

Эта двойственность важна при интеграции с внешними таймерами и системами синхронизации.

Сегменты и петли воспроизведения

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

Если установлен режим loop:

animation.loop = true

то поведение сегмента изменяется:

  • при достижении endFrame воспроизведение возвращается к startFrame
  • цикл продолжается бесконечно

Комбинация loop и playSegments используется для:

  • бесконечных индикаторов загрузки
  • анимированных фонов
  • пульсирующих элементов интерфейса

Динамическое переключение сегментов

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

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

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

  • idle → [0, 20]
  • active → [20, 50]
  • success → [50, 80]
  • error → [80, 110]

Переключение между ними осуществляется через playSegments с forceFlag = true, обеспечивая мгновенный переход.

Синхронизация сегментов с внешними системами

Сегментное воспроизведение часто связывается с:

  • HTTP запросами
  • WebSocket событиями
  • пользовательскими действиями
  • таймерами

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

Основная стратегия:

  • событие запускает сегмент
  • завершение сегмента фиксируется через callback complete
  • следующее состояние инициируется внешней логикой

Завершение сегмента и контроль состояния

Каждый сегмент может сопровождаться событием завершения анимации:

animation.addEventListener('complete', handler)

Однако важно учитывать, что событие относится ко всей анимации, а не к отдельному сегменту. Поэтому при использовании playSegments требуется дополнительное отслеживание текущего диапазона.

Распространённый подход:

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

Ограничения сегментного подхода

При всей гибкости существуют ограничения:

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

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

Поведение при изменении скорости

При использовании:

animation.setSpeed(value)

все активные сегменты масштабируются по времени воспроизведения. Это означает:

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

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