Как создать пользовательскую функцию замедления с помощью Core Animation?

Я довольно хорошо анимирую CALayer по CGPath (QuadCurve) в iOS. Но я бы хотел использовать более интересную функцию ослабления, чем несколько , предоставленных Apple (EaseIn / EaseOut и т. Д.). Например, отскок или упругая функция.

Эти вещи можно делать с помощью MediaTimingFunction (безье):

enter image description here

Но я ' Я хотел бы создать функции синхронизации более сложные. Проблема в том, что для синхронизации мультимедиа, похоже, требуется кубический Безье, который недостаточно мощный для создания этих эффектов:

enter image description here
(источник: sparrow-framework.org )

Код создать вышеуказанное достаточно просто в других фреймворках, что очень расстраивает. Обратите внимание, что кривые отображают время входа и время выхода (кривая Tt), а не кривые время-положение. Например, easyOutBounce (T) = t возвращает новый t . Затем этот t используется для построения движения (или любого другого свойства, которое мы должны анимировать).

Итак, я хотел бы создать сложную пользовательскую CAMediaTimingFunction , но я понятия не имею как это сделать, или если это? s даже возможно? Есть ли альтернативы?

РЕДАКТИРОВАТЬ:

Вот конкретный пример по шагам. Очень поучительно :)

  1. Я хочу анимировать объект вдоль линии от точки a до b , но я хочу, чтобы он «подпрыгивал» своим движением вдоль линии с помощью easyOutBounce кривая выше. Это означает, что он будет следовать точной линии от a до b , но будет ускоряться и замедляться более сложным образом, чем это возможно при использовании текущей функции CAMediaTimingFunction на основе Безье.

  2. Давайте сделаем для этой линии любое произвольное перемещение кривой, указанное с помощью CGPath. Он должен по-прежнему двигаться по этой кривой, но он должен ускоряться и замедляться так же, как в примере с прямой.

Теоретически я думаю, что это должно работать следующим образом:

Опишем кривую движения как анимацию ключевого кадра move (t) = p , где t - время [0..1], p - положение рассчитано в момент времени t . Таким образом, move (0) возвращает позицию в начале кривой, перемещает (0,5) в точную середину и перемещает (1) в конце. Использование временной функции time (T) = t для предоставления значений t для хода должно дать мне то, что я хочу. Для эффекта отскока функция синхронизации должна возвращать те же значения t для времени (0,8) и времени (0,8) (только пример). Просто замените функцию синхронизации, чтобы получить другой эффект.

(Да, это '' s можно выполнять подпрыгивание линии, создавая и объединяя четыре отрезка линии, которые движутся вперед и назад, но в этом нет необходимости. В конце концов, это всего лишь простая линейная функция, которая отображает значения времени на позиции.)

Надеюсь, я здесь понимаю.

111
задан Glorfindel 9 August 2019 в 05:14
поделиться