Как вычислить продолжительность анимации UIViewAnimationCurveEaseOut с известной начальной скоростью и расстоянием? - PullRequest
4 голосов
/ 24 декабря 2009

Я анимирую вид между двумя точками, используя UIViewAnimationCurveLinear, поэтому я знаю скорость этой анимации. В определенных обстоятельствах я хочу добавить UIViewAnimationCurveEaseOut, чтобы замедлить представление до остановки. Чтобы сделать этот эффект плавным, анимация замедления должна начинаться с той же скоростью, что и линейная анимация, которая предшествовала ему. Учитывая фиксированное расстояние, на котором я хочу, чтобы это замедление произошло, как я могу вычислить продолжительность, необходимую для достижения этой известной начальной скорости?

Например, допустим, я оживляю свой вид с x = 0 до x = 100 в течение 10 секунд. Скорость составляет 10 пикселей в секунду. Теперь я хочу, чтобы представление замедлялось с x = 100 до x = 120 с помощью анимации UIViewAnimationCurveEaseOut. Какова должна быть продолжительность этой анимации, чтобы она начиналась со скоростью 10 пикселей в секунду?

Насколько я понимаю, функция Core Animation CAMediaTimingFunction управляет шагом анимации, используя кубические кривые Безье, где вторая и третья контрольные точки определяют форму кривой. Я предполагаю, что функции замедления UIViewAnimationCurve также являются кубическими кривыми Безье. Если бы я знал контрольные точки по умолчанию, используемые этими функциями, у меня была бы возможность разработать формулу для вычисления длительности с учетом скорости и расстояния, но мне не удалось найти эти контрольные точки по умолчанию, документированные где-либо.

Ответы [ 2 ]

1 голос
/ 13 июля 2010

Возможно, я не смогу дать вам полный ответ, но я могу указать вам на -getControlPointAtIndex: values: метод CAMediaTimingFunction. Это должно позволить вам создать функцию синхронизации EaseOut, а затем изучить ее контрольные точки.

Я также укажу вам на статью Мэтта Галлахера о пользовательских кривых ускорения, выполненных с использованием CAKeyframeAnimation, которые также могут быть вам полезны.

0 голосов
/ 14 декабря 2014

Вы можете использовать константу (назовите ее BEZIER_INTEGRAL_CONSTANT), которая аппроксимирует интеграл кривой Безье для анимации, длина которой составляет 1 секунду, начиная со скорости 1 пиксель в секунду. Для линейного ослабления эта константа равна 0.5. Для UIViewAnimationCurveEaseOut это приблизительно 0.7. Формула в терминах длительности:

duration = distance / (velocity * BEZIER_INTEGRAL_CONSTANT)

Для вашего примера, когда расстояние равно 20 пикселям, а начальная скорость равна 10 пикселям в секунду, продолжительность должна быть примерно равна: 20 / (10 * 0.7) = 2.9 seconds.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...