В Vivus анимация SVG строится вокруг последовательного отображения
путей, где каждый сегмент линии становится видимым в соответствии с
внутренним прогрессом воспроизведения. Одним из низкоуровневых
механизмов управления этим процессом является установка прогресса кадра
вручную через setFrameProgress.
Этот метод относится к категории средств прямого контроля временной шкалы анимации, позволяя обходить автоматическое воспроизведение и задавать текущее состояние отрисовки SVG как функцию прогресса.
Внутри Vivus каждый SVG-путь преобразуется в набор измеряемых сегментов. При анимации библиотека управляет параметрами:
Прогресс кадра представляет собой нормализованное состояние анимации, при котором:
0 соответствует полностью скрытому состоянию1 соответствует полностью отрисованному SVGМежду этими значениями происходит интерполяция состояния всех элементов графики.
Метод setFrameProgress устанавливает внутреннее
состояние анимационного цикла без запуска автоматического таймера
воспроизведения. В результате вычисляется промежуточное состояние всех
SVG-элементов.
Типовая сигнатура в логике библиотеки:
vivus.setFrameProgress(progress);
где progress — число в диапазоне от 0 до
1.
При передаче значения происходит пересчёт:
Каждый путь SVG имеет собственную длину L. При заданном
прогрессе p вычисляется видимая часть:
visible_length = L * p
Оставшаяся часть скрывается через смещение обводки:
offset = L * (1 - p)
Таким образом, метод setFrameProgress фактически
управляет коэффициентом заполнения пути.
visible_length = Lp
offset = L(1 - p)
В отличие от методов управления воспроизведением:
play() запускает автоматическую анимацию с временным
интерваломstop() приостанавливает текущий циклreset() возвращает состояние к начальному кадруsetFrameProgress не зависит от таймера и не использует
внутренний requestAnimationFrame цикл. Он устанавливает состояние
мгновенно и детерминированно.
Ручная установка прогресса используется в сценариях, где требуется синхронизация SVG с внешними источниками времени или состоянием интерфейса:
В таких случаях прогресс анимации становится функцией внешнего параметра:
p = f(state)
При интеграции с пользовательским вводом или временем метод позволяет рассматривать Vivus как систему временной интерполяции.
Если обозначить время анимации как t, а общую
длительность как T, то:
p = t / T
p =
Таким образом, изменение времени напрямую преобразуется в изменение состояния SVG.
При наличии нескольких элементов SVG каждый путь имеет собственную нормализованную длину, но общий прогресс применяется ко всем одновременно.
Внутренний алгоритм выполняет:
Это означает, что setFrameProgress не управляет
отдельными элементами, а воздействует на всю сцену как на единый слой
анимации.
При экстремально малых или больших значениях прогресса возможны особенности:
Также стоит учитывать, что визуальная плавность зависит от плотности точек пути, так как Vivus оперирует геометрией, а не растровыми пикселями.
Хотя setFrameProgress задаёт состояние напрямую,
итоговое визуальное распределение может зависеть от выбранной временной
функции интерполяции в случае предварительно рассчитанных значений.
При использовании линейной модели прогресса:
p(t) = t
p(t) = t
поведение остаётся строго равномерным. В случае кастомных функций интерполяции значение прогресса может быть преобразовано перед передачей в метод.
В архитектуре управления состоянием интерфейса
setFrameProgress часто становится конечной точкой
вычислительного конвейера:
Такая модель позволяет отделить логику интерфейса от визуального слоя, оставляя Vivus исключительно как рендерер состояния анимации.
При скачкообразной смене прогресса отсутствует промежуточная интерполяция. Это означает:
Такой режим подходит для дискретных состояний интерфейса, но не для кинематически плавных переходов без внешнего интерполятора.
Каждый вызов setFrameProgress инициирует перерасчёт
геометрии всех путей SVG. При сложных изображениях с большим количеством
сегментов это может приводить к:
Оптимизация достигается ограничением частоты вызовов и использованием throttle или requestAnimationFrame в внешнем коде управления.