我正在尝试获得一个可以在我的移动应用程序中实现的通用平滑滚动机制。
我希望它足够通用,以便可以移植到任何平台,但我目前正在.net Compact Framework 上使用 C#。
我现在正在做的是:
- 创建一个秒表对象(在面板的 ctor 中)
- 在鼠标按下时启动秒表并保存当前鼠标点
_lastMouse
- 在鼠标移动时,停止秒表并存储,
velocity = (_lastMouse - curMouse) / Stopwatch.TotalSeconds
然后重置秒表并重新启动- 大多数情况下
Stopwatch.TotalSeconds
介于 0.02 和 0.03 之间
- 大多数情况下
- 在鼠标向上时,我将
velocity
值传递给平滑滚动函数,并且该函数继续滚动面板,直到到达末端或增加的摩擦力导致速度 == 0
我的问题是在最后一步。这些velocity
值通常在 2,000-3,000 像素范围内。速度以每秒像素为单位,因此这是意料之中的。我拿起秒表(它应该仍在运行),停止它,我找到从最后一次鼠标移动经过的时间并乘以velocity
,Stopwatch.TotalSeconds
得到那个距离,然后重置并启动秒表,然后循环回来并重新开始。
预期的结果是刷新之间的经过时间乘以速度应该给我应该滚动的像素数(根据最后一次鼠标移动)。我的实际结果是,有时面板会飞起来,有时会移动!逐渐减速很好,只是开始速度关闭
逻辑上有缺陷吗?我应该做点别的吗?
谢谢你的帮助!