у меня есть CListCtrl
который имеет около 100 000+ записей. Пользователю предоставляется окно поиска для поиска среди этих записей. Найдя совпадение, я выбрал его и выделил его, используя EnsureVisible
.
Этот свиток происходит мгновенно. Я хотел попробовать написать анимацию, которая выглядит как те, демо здесь (особенно анимация «Go Top — Easing 2»).
Я думаю, для основной анимации,
Scroll
с шагом 1 (или другим более оптимальным значением) с задержкой до увеличения = результат шага 5.Я попробовал это, и я невероятно запутался. Во-первых, мой алгоритм в порядке? Во-вторых, есть ли другой, лучший способ добиться этого (желательно аналогично анимации 2 в ссылка выше)?
Ваш алгоритм кажется нормальным для простой линейной прокрутки. Однако ваша ссылка указывает на прокрутки с использованием различных функций замедления.
Функции ослабления не прокручиваются на одну и ту же величину каждый раз, но увеличиваются или уменьшаются, чтобы выглядеть так, будто они ускоряются или замедляются.
Распространенным способом определения значений ослабления является использование синуса. Если вы изобразите синусоидальную волну и представите, что по ходу волны вы видите только один ее пиксель за раз, пиксель «ослабнет» в крайних значениях и ускорится через средние значения.
Ваша анимация Easing 2 просто добавляет немного отскока в начале и в конце, этого легко достичь, используя немного синусоиды за крайностями на каждом конце. например.
_
/ \
/
\_/
Если вы хотите код, я ответил на аналогичный вопрос Вот в C #.
Других решений пока нет …