Easing-функции — это математические зависимости, определяющие, как изменяется значение параметра во времени при анимации. В контексте работы с Paper.js они управляют скоростью интерполяции свойств объектов: позиции, масштаба, вращения, прозрачности и других характеристик.
В отличие от линейной интерполяции, где изменение происходит равномерно, easing-функции позволяют создавать более естественные, физически правдоподобные движения: ускорение, замедление, колебания, отскоки.
Линейная функция задаётся выражением:
f(t) = t
где t — нормализованное время в диапазоне
[0, 1].
Особенности:
В Paper.js линейная интерполяция часто используется как отправная точка для более сложных анимаций.
Easing-функции обычно делятся на три базовые категории:
1. Ease In
2. Ease Out
3. Ease In-Out
Квадратичные функции — одни из самых простых нелинейных вариантов.
Ease In:
f(t) = t²
Ease Out:
f(t) = t * (2 - t)
Ease In-Out:
f(t) = 2t², если t < 0.5
f(t) = -1 + (4 - 2t) * t, если t ≥ 0.5
Особенности:
Увеличение степени усиливает эффект ускорения и замедления.
Кубическая функция:
f(t) = t³
Преимущества:
Аналогично существуют:
t⁴)t⁵)С ростом степени:
Используют тригонометрические функции для создания плавных кривых.
Ease In:
f(t) = 1 - cos(t * π / 2)
Ease Out:
f(t) = sin(t * π / 2)
Ease In-Out:
f(t) = -(cos(π * t) - 1) / 2
Характеристики:
Экспоненциальные easing-функции создают эффект резкого старта или остановки.
Ease In:
f(t) = 2^(10 * (t - 1))
Ease Out:
f(t) = 1 - 2^(-10 * t)
Особенности:
Имитируют поведение пружины с колебаниями.
Пример:
f(t) = sin(13π/2 * t) * 2^(10 * (t - 1))
Свойства:
Используются для:
Моделируют эффект падения и отскока.
Пример реализации (упрощённо):
f(t) = 1 - bounce(1 - t)
Где bounce — кусочная функция.
Характеристики:
Paper.js не содержит встроенной системы easing, поэтому функции реализуются вручную.
Пример базовой анимации с easing:
var start = new Point(50, 50);
var end = new Point(300, 300);
var duration = 1000;
var startTime = null;
function easeInOutQuad(t) {
return t < 0.5
? 2 * t * t
: -1 + (4 - 2 * t) * t;
}
view.onFr ame = function(event) {
if (!startTime) startTime = event.time * 1000;
var currentTime = event.time * 1000 - startTime;
var t = Math.min(currentTime / duration, 1);
var eased = easeInOutQuad(t);
var position = start.add(end.subtract(start).multiply(eased));
circle.position = position;
if (t === 1) view.onFr ame = null;
};
Ключевые элементы:
Основная формула интерполяции:
value = start + (end - start) * f(t)
Где:
start — начальное значениеend — конечное значениеf(t) — easing-функцияВ Paper.js это часто применяется к:
PointSizeВозможно комбинирование функций для создания сложных эффектов.
Пример:
function customEase(t) {
return Math.sin(t * Math.PI) * t;
}
Результат:
Выбор функции:
Контроль времени:
t в диапазон
[0, 1]Производительность:
onFrameЧитаемость:
easeInQuad,
easeOutCubic)Easing-функции легко масштабируются:
Пример генератора:
function createPowerEase(power) {
return function(t) {
return Math.pow(t, power);
};
}
Использование:
var ease = createPowerEase(4);
Различия easing-функций особенно заметны при одинаковой анимации:
Грамотный выбор функции напрямую влияет на восприятие интерфейса и ощущение качества анимации.