Физическая проблема: вычисление расстояния только от скорости - PullRequest
1 голос
/ 17 июня 2011

Я создаю элемент управления на основе перетаскивания во Flex / Flash, похожий на кинопленку, где человек может проводить пальцем по горизонтали для прокрутки элементов. Чтобы сделать управление более естественным, я добавил некоторую инерцию, чтобы замедлить прокрутку после того, как произойдет пролистывание. При первой загрузке будет отображаться пять элементов с номерами «х», которые необходимо прокрутить, а третий элемент будет отцентрирован и выбран.

Моя проблема, однако, заключается в том, что при анимации я хочу, чтобы жест смахивания определял, находится ли элемент в центре (3-я позиция), и соответствующим образом корректирует его расчет перемещения, чтобы он стыковался с 3-й / центральной позицией. Представьте, что вы выполняете длинный удар, он пропускает количество элементов «х», но когда он замедляется до остановки, он элегантно останавливается, когда предмет находится в центре / в 3-й позиции. Я считаю, что для этого мне нужно определить расстояние для перемещения только по значению скорости (поскольку время не имеет отношения к опыту пользователя, т. Е. Более длинное / более сильное перелистывание оправдывает более длительную анимацию, скользящую по элементам).

В данный момент я вызываю подпрограмму анимации (с инерцией) в событии ENTER_FRAME, когда пользователь генерирует событие MOUSE_UP. Когда они это делают, я получаю скорость перетаскивания (предварительно контролируя это) и затем уменьшаю это значение скорости при каждом вызове события ENTER_FRAME, пока оно не достигнет соответствующего значения, чтобы остановить анимацию.

К сожалению, все расчеты скорости, которые я видел, касаются скорости и времени, чтобы определить расстояние, мне просто нужна скорость. По общему признанию, мои знания не сильны в этой области, поэтому я могу упустить очевидное.

Приветствия заранее ...

Ответы [ 2 ]

0 голосов
/ 17 июня 2011

Если вы уменьшаете скорость на фиксированную величину (назовите ее D) каждый раз, когда вводите новый кадр, и останавливаетесь, когда скорость падает ниже определенного порога, тогда проблема довольно проста.Установите порог, скажем, 0,7 * D, затем вы можете разделить начальную скорость на D и округлить, что даст вам количество пройденных кадров, назовите его N. Затем уменьшите начальную скорость, скажем, (N +0,01) * D, и все готово.

0 голосов
/ 17 июня 2011

Сначала определите позицию, в которой вы окажетесь, если вы использовали значение замедления по умолчанию, затем выясните, какой элемент находится ближе всего к центру при прокрутке до этой позиции, а затем вычислите новое значение замедления, которое заканчивается именно на этом элементе.

Я не помню, чтобы в голове у меня была математика для таких вычислений, но это исчисление, вероятно, с интегралом или чем-то в этом роде.

Таким образом, вы можете рассчитать время, если хотите, но вам не нужно знать это заранее.

(кстати, я думаю, вам нужно будет сделать особый случай, когда проведите пальцем недостаточно быстро, чтобы переместиться даже на один элемент. Возможно, что пользователь просто слегка покачивает мышью, и в этом случае у вас должен быть текущий пункт получения.)


Лично я бы не принял подход, с которым вы идете. Я просто позволил бы ему прокручиваться со значением замедления по умолчанию, а затем медленно центрироваться, какой бы пункт не находился ближе всего, когда скорость становится ниже определенного порога. Это означало бы, что элемент может перескочить, а затем медленно прокрутиться назад, но я думаю, что небольшое перерегулирование и коррекция будут выглядеть круто.

...