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