Подтвердить что ты не робот

Алгоритм реализации кинетической прокрутки

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

4b9b3361

Ответ 1

Недавно я реализовал его. Это шаги, которые я предпринял.

  • Вам нужно измерить скорость вашего курсора (курсор мыши или палец)
  • Реализовать простой цикл физики частиц. Информацию о том, как это сделать, можно найти здесь
  • дайте вашим "границам" частицы, используя математику, полученную из ширины вашей плоскости прокрутки, и ширину вашего окна просмотра.
  • Постоянно добавьте разницу между скоростью мыши и скоростью частицы до скорости частицы, поэтому скорость частицы "соответствует" скорости мыши до тех пор, пока она движется.
  • Прекратите делать шаг 4, как только пользователь поднимет свой палец. Цикл физики заботится об инерции.
  • Добавьте свои личные расцветки, такие как поля "бампер", и гладкие прокручивающие "якорные" точки, которые действуют на парадокс дзено для расчета движения.
  • Я чуть не забыл: возьмите координаты, полученные сверху, и используйте его в качестве местоположения вашей прокручивающейся плоскости.

Скорее всего, скоро открою исходный код этого кода. Как скоро вам это нужно?

Изменить: изменил ссылку. Извините, указав на неверную страницу. edit2: или нет? Во всяком случае, исходная страница, с которой я связан, была первой ссылкой на связанную на данный момент страницу.

Ответ 2

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

Ответ 3

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

Поскольку это довольно сложная проблема, я решил разделить ее на несколько несколько независимых подзадач, как показано ниже:

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

  • Инерция прокрутки: эта была самой сложной задачей. Идея здесь заключается в том, что прокрутка должна продолжаться некоторое время после того, как пользователь поднимает палец, замедляя его, пока он полностью не остановится. Для этого мне нужно было иметь представление о скорости прокрутки. К сожалению, неточно вычислить скорость из одного образца, поэтому, пока пользователь прокручивает, я записываю последние события N движения в круговом буфере вместе со временем, в которое произошло каждое событие. Я обнаружил, что N = 4 отлично работает на iPhone и на сенсорной панели HP. Когда палец поднимается, я могу вычислить приблизительную начальную скорость для инерционной прокрутки из записанного движения. Я определил отрицательный коэффициент ускорения и использовал стандартные формулы движения (см. здесь), чтобы прокрутка сильно стиралась. Если положение прокрутки достигает границы, пока все еще в движении, я просто reset скорость до 0, чтобы предотвратить ее выход за пределы диапазона (крутой стоп-сигнал рассматривается далее).

  • Гибкие пределы прокрутки: вместо того, чтобы идти в резкую остановку, когда прокрутка достигает конца, я хотел, чтобы виджет прокручивал некоторые, но предлагал сопротивление. Для этого я расширил допустимый диапазон прокрутки на обоих концах на величину, которую я определил как функцию размеров виджета. Я обнаружил, что добавление половины ширины или высоты на каждом конце хорошо работало. Трюк, позволяющий прокручивать ощущение, что он предлагает некоторое сопротивление, состоял в том, чтобы отрегулировать отображаемые позиции прокрутки, когда они находятся вне диапазона. Я использовал масштабирование и функцию замедления для этого (есть некоторые хорошие функции ослабления здесь).

  • Spring поведение: теперь можно прокручивать действительный диапазон, мне нужен способ вернуть скроллер в допустимую позицию, если пользователь оставил его вне ассортимент. Это достигается путем корректировки смещения прокрутки, когда скроллер останавливается в положении вне диапазона. Функция регулировки, которую я нашел, чтобы дать приятный упругий вид, заключалась в том, чтобы разделить расстояние от текущей позиции до желаемой позиции на константу и сдвинуть смещение на эту величину. Чем больше константа, тем медленнее движение.

  • Полоса прокрутки: последним прикосновением было добавление прокрутки полосы прокрутки, которые исчезают, когда прокрутка начинается и исчезает, когда она заканчивается.

Ответ 4

Вы посмотрели на функции Роберта Пеннера?

http://www.robertpenner.com/easing/

IIRC, они были первоначально для ActionScript и были в течение долгого времени.

Ответ 5

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