Как сделать анимацию с плавной прокруткой?

у меня есть CListCtrl который имеет около 100 000+ записей. Пользователю предоставляется окно поиска для поиска среди этих записей. Найдя совпадение, я выбрал его и выделил его, используя EnsureVisible.

Этот свиток происходит мгновенно. Я хотел попробовать написать анимацию, которая выглядит как те, демо здесь (особенно анимация «Go Top — Easing 2»).

Я думаю, для основной анимации,

  1. Получить текущий выбор.
  2. Получить целевой выбор.
  3. Вычислить разницу.
  4. Получить высоту пикселя одного элемента.
  5. Многочисленные результаты шагов 3 и 4.
  6. Scroll с шагом 1 (или другим более оптимальным значением) с задержкой до увеличения = результат шага 5.

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

0

Решение

Ваш алгоритм кажется нормальным для простой линейной прокрутки. Однако ваша ссылка указывает на прокрутки с использованием различных функций замедления.

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

Распространенным способом определения значений ослабления является использование синуса. Если вы изобразите синусоидальную волну и представите, что по ходу волны вы видите только один ее пиксель за раз, пиксель «ослабнет» в крайних значениях и ускорится через средние значения.

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

     _
/ \
/
\_/

Если вы хотите код, я ответил на аналогичный вопрос Вот в C #.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector