Я неплохо анимирую CALayer
вдоль CGPath
(QuadCurve) в iOS. Но я бы хотел использовать более интересную функцию замедления, чем несколько , предоставляемых Apple (EaseIn/EaseOut и т.д.). Например, отказов или упругой функции.
Эти вещи можно сделать с помощью MediaTimingFunction (Безье):
Но я хотел бы создать функции синхронизации, которые являются более сложными. Проблема заключается в том, что для синхронизации мультимедиа требуется кубический Безье, недостаточно мощный для создания этих эффектов:
(источник: sparrow-framework.org)
Код code для создания вышеприведенного кода достаточно прост в других средах, что очень расстраивает. Обратите внимание, что кривые отображают время ввода на время вывода (кривая T-t), а не кривые временного положения. Например, easeOutBounce (T) = t возвращает новый t. Затем этот t используется для построения графика движения (или любого другого свойства, которое мы должны анимировать).
Итак, я хотел бы создать сложный кастом CAMediaTimingFunction
, но я понятия не имею, как это сделать, или если это вообще возможно? Есть ли альтернативы?
EDIT:
Вот конкретный пример шагов. Очень познавательно :)
Я хочу анимировать объект вдоль линии от точки a до b, но я хочу, чтобы он "отражал" свое движение вдоль линии, используя кривую easeOutBounce выше. Это означает, что он будет следовать точной линии от a до b, но будет ускоряться и замедляться более сложным способом, чем это возможно при использовании текущей CAMediaTimingFunction на основе Безье.
Давайте сделаем эту линию любым произвольным движением кривой, заданным с помощью CGPath. Он все еще должен двигаться вдоль этой кривой, но он должен ускоряться и замедляться так же, как в примере с линией.
Теоретически я думаю, что это должно работать так:
Давайте опишем кривую движения как анимацию ключевого кадра move (t) = p, где t - время [0..1], p - позиция, рассчитанная в момент времени t. Таким образом, move (0) возвращает позицию в начале кривой, перемещает (0.5) точную середину и Move (1) в конце. Использование функции времени time (T) = t для предоставления значений t для перемещения должно дать мне то, что я хочу. Для эффекта отскакивания функция хронирования должна возвращать одинаковые значения t для времени (0,8) и времени (0,8) (только пример). Просто замените функцию синхронизации, чтобы получить другой эффект.
(Да, можно выполнять отскок строк, создавая и соединяя четыре отрезка линии, которые перемещаются назад и вперед, но в этом нет необходимости. В конце концов, это просто простая линейная функция, которая отображает значения времени в позиции.)
Я надеюсь, что здесь есть смысл.