c++ - 如何制作流畅的滚动动画?

标签 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 步的结果。

我试过了,但我感到非常困惑。首先,我的算法可以吗?其次,是否有另一种更好的方法来实现这一点(最好类似于 link above 中的动画 2)?

最佳答案

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

缓动函数不会每次滚动相同的量,但增加或减少是为了让它们看起来像在加速或减速。

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

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

     _
    / \
   /
\_/

如果你想要一些代码,我回答了一个类似的问题here在 C# 中。

关于c++ - 如何制作流畅的滚动动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107358/

相关文章:

javascript - CSS 在滚动时发生变化,但随着滚动速度的变化

c++ - 多个顶层窗口

c++ - 使用模板别名、继承模板和使用 "template parent' s"types 时编译错误

c++ - 复制派生类的构造函数,而不测试所有类型?

java - 修复 Java 中动画 gif 的帧速率

html - SVG蜂窝多边形填充动画

c++ - 在基于 Windows MFC 对话框的应用程序中,stdout 输出不显示在控制台上

c++ - 从业务逻辑向 UI 发送消息

c++ - 如何在 C++ 中将数据插入嵌套映射?

c++ - C 或 C++ 中的灰度图像翻转?