如何制作平滑的滚动动画?

时间:2013-04-19 14:47:52

标签: c++ animation mfc scroll clistctrl

我有一个CListCtrl,其中包含大约100,000个条目。向用户呈现搜索框以在这些条目中进行搜索。在找到匹配项时,我将其设置为选择并使用EnsureVisible滚动到它。

这个卷轴瞬间发生。我想尝试编写一个类似于ones demoed here的动画(特别是'Go Top - Easing 2'动画)。

我在想,对于一个基本的动画,

  1. 获取最新选择。
  2. 获取目标选择。
  3. 计算差异。
  4. 获取一个项目的像素高度。
  5. 第3步和第4步的结果很多。
  6. Scroll增量为1(或其他更优化的值),延迟时间为增量=步骤5的结果。
  7. 我试过这个,我感到非常困惑。首先,我的算法好吗?其次,是否有另一种更好的方法来实现这一点(最好类似于link above中的动画2)?

1 个答案:

答案 0 :(得分:1)

您的算法似乎可以用于简单的线性滚动。但是,您的链接指向使用各种缓动功能的滚动。

缓和功能每次都不会滚动相同的数量,但增加或减少的目的是为了加速或减慢速度。

计算缓动值的常用方法是使用正弦结果。如果你想象一个正弦波并想象你一次只能看到它的一个像素,随着波的进展,像素将“缓和”在极端并加速通过中间值。

你的Easing 2动画只是在开始和结束时添加了一点反弹,这很容易通过使用一些正弦波超过每端的极值来实现。例如

     _
    / \
   /
\_/

如果您需要一些代码,我在C#中回答了类似的问题here