【发布时间】:2011-03-22 21:42:37
【问题描述】:
我正在尝试获得一种可以在我的移动应用程序中实现的通用平滑滚动机制。
我希望它足够通用,以便可以移植到任何平台,但我目前在 .net Compact Framework 上使用 C#。
我现在正在做的是:
- 创建一个 Stopwatch 对象(在面板的 ctor 中)
- 鼠标按下启动秒表并保存当前鼠标点
_lastMouse - 鼠标移动时,停止秒表并存储
velocity = (_lastMouse - curMouse) / Stopwatch.TotalSeconds,然后重置秒表并重新启动- 在大多数情况下,
Stopwatch.TotalSeconds介于 0.02 和 0.03 之间
- 在大多数情况下,
- 鼠标向上时,我将
velocity值传递给平滑滚动函数,该函数会继续滚动面板,直到到达终点或增加的摩擦力导致速度为 == 0
我的问题在最后一步。 velocity 值通常在 2,000-3,000 像素范围内。速度以每秒像素为单位,因此这是意料之中的。我拿起秒表(它应该仍在运行),停止它,然后我找到从上次鼠标移动经过的时间并将velocity 乘以Stopwatch.TotalSeconds,得到那个距离,然后重置并启动秒表,然后循环回来并开始重新来过。
预期结果是刷新之间的经过时间乘以速度应该得到我应该滚动的像素数(根据最后一次鼠标移动)。我的实际结果是,有时面板会飞起来,有时会移动!逐渐减速很好,只是开始速度关闭了
逻辑有问题吗?我应该做点别的吗?
感谢您的帮助!
【问题讨论】:
-
所有较新的框架都内置了这个。至少说明您使用的版本,这是一个移动的目标。更好地学习 SilverLight。
-
是的,我猜所有较新的框架都有内置的面板动量助手。但我使用的是 .net Compact Framewrok 3.5 和 Windows Mobile 6.1 和 6.5(不是 6.5.3)
-
看看 CodePlex 的流畅和移动。
-
你知道平台上实际的时序分辨率和精度是多少吗?显然,如果这是不稳定的,那么你会得到有趣的结果。另外,您的滚动有多少差异?即使您以恒定的速度移动,您是否会获得快/慢滚动?
-
时间分辨率以tick为单位,所以毫秒应该是相当准确的。当以恒定的速度移动时,sparatic 滚动发生的频率较低。如果我在最后做轻弹,那会增加烦躁(有时只是停止,有时飞到底部)
标签: c# mobile physics smooth-scrolling