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