我有一个 CListCtrl
,它有大约 100,000 多个条目。用户会看到一个搜索框,用于在这些条目中进行搜索。在找到匹配项时,我将其设置为一个选择并使用 EnsureVisible
滚动到它。 .
这个卷轴是瞬间发生的。我想尝试编写一个看起来类似于 ones demoed here 的动画。 (尤其是“Go Top - Easing 2”动画)。
我在想,对于一个基本的动画,
- 获取当前选择。
- 获取目标选择。
- 计算差异。
- 获取一项的像素高度。
- 将第 3 步和第 4 步的结果相乘。
-
Scroll
增加 1(或其他一些更优的值),并延迟直到增量 = 第 5 步的结果。
我试过了,但我感到非常困惑。首先,我的算法可以吗?其次,是否有另一种更好的方法来实现这一点(最好类似于 link above 中的动画 2)?
最佳答案
对于简单的线性滚动,您的算法似乎没问题。但是,您的链接指向使用各种缓动功能的滚动条。
缓动函数不会每次滚动相同的量,但增加或减少是为了让它们看起来像在加速或减速。
计算缓动值的常用方法是使用正弦的结果。如果您描绘一个正弦波并想象您一次只能看到它的一个像素,那么随着波的前进,该像素将在极值处“缓和”并加速通过中间值。
您的 Easing 2 动画只是在开始和结束时添加了一点弹跳,这很容易通过在每一端使用超过极值的一点正弦波来实现。例如。
_
/ \
/
\_/
如果你想要一些代码,我回答了一个类似的问题here在 C# 中。
关于c++ - 如何制作流畅的滚动动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107358/