Я анімую CALayer
разом CGPath
(QuadCurve) досить добре в iOS. Але я хотів би скористатися цікавішою функцією полегшення, ніж ті, які надає Apple (EaseIn / EaseOut тощо). Наприклад, функція відскоку або пружність.
Ці речі можна зробити з MediaTimingFunction (безьє):
Але я хотів би створити функції часу, які є більш складними. Проблема полягає в тому, що, здається, для медіа-таймінгу потрібен кубічний безьє, який не є достатньо потужним для створення цих ефектів:
(джерело: sparrow-framework.org )
Код , щоб створити розглянутому вище , є досить простим в інших рамках, що робить це дуже засмучує. Зверніть увагу, що криві відображають вхідний час на час виходу (крива Тт), а не криві часового положення. Наприклад, easyOutBounce (T) = t повертає нову t . Потім це t використовується для побудови руху (або будь-якого властивості, яке ми мусимо оживити).
Отже, я хотів би створити складний звичай, CAMediaTimingFunction
але я не маю поняття, як це зробити, або якщо це навіть можливо? Чи є альтернативи?
Редагувати:
Ось конкретний приклад кроків. Дуже освітянський :)
Я хочу , щоб оживити об'єкт уздовж лінії від точки А до б , але я хочу його «відскік» свій рух уздовж лінії , використовуючи криву easeOutBounce вище. Це означає, що він буде слідувати точній лінії від a до b , але прискориться і сповільниться більш складним способом, ніж це можливо, використовуючи поточний CAMediaTimingFunction на основі безьє.
Дозволяє зробити цю лінію будь-яким довільним рухом кривої, визначеним CGPath. Він все одно повинен рухатися по цій кривій, але він повинен прискорюватися і зменшуватися так само, як у прикладі лінії.
Теоретично я думаю, що це має працювати так:
Давайте опишемо криву руху як рух анімації ключових кадрів (t) = p , де t - час [0..1], p - положення, обчислене в момент t . Отже, переміщення (0) повертає положення на початку кривої, переміщуємо (0,5) точну середину і рухаємо (1) в кінці. Використання функції функціонування часу (T) = t для надання значень t для переміщення має дати мені те, що я хочу. Для підстрибуючи ефекту, функція часу повинна повертати одні і ті ж т значення часу (0.8) і часу (0.8)(лише приклад). Просто замініть функцію синхронізації, щоб отримати інший ефект.
(Так, можна робити підстрибування рядків, створюючи та з'єднуючись чотири рядкові сегменти, які йдуть вперед і назад, але це не повинно бути необхідним. Зрештою, це просто проста лінійна функція, яка відображає значення часу на позиції.)
Я сподіваюся, що я маю сенс тут.