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