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

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

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

4
cduhn 24 Дек 2009 в 11:17
Почему бы просто не использовать EaseOut для всей анимации?
 – 
David Kanarek
17 Янв 2010 в 00:21

2 ответа

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

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

1
Jason Foreman 13 Июл 2010 в 18:04

Вы можете использовать константу (назовем ее 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.

0
Kevin Borders 14 Дек 2014 в 01:29