2013-04-19 4 views
0

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

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

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

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

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

ответ

1

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

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

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

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

 _ 
    /\ 
/
\_/ 

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

+0

На самом деле, мой алгоритм не работал вообще, ха-ха! Но да. Я предполагаю, что это приближает меня к тому, что я хотел. Я попробую это и вернусь. Спасибо за ваш ответ! –