使用 FingerFlicker 实现 iPhone 式列表滚动
一个简单的例子,展示如何构建一个流畅运行的、由手指控制的列表。
引言
前几天我在 Google 上搜索一个特殊的列表。我希望它像 iPhone 的列表一样工作,但希望它看起来更像 Nano 的列表(我喜欢它简单的布局)。
我在 Google 上找不到实现此功能的 C# 代码,所以我自己编写了一个列表控件。现在,该列表具有玻璃状按钮、双缓冲图形、用于异步音频的 Win32 调用和渐变。我还实现了多个线程,并使用基于事件的线程内通信。列表在一个线程上移动,并在另一个线程上绘制。
无论如何,这仍然是一个正在进行中的工作。这还不能用于生产环境,但我正在努力。
如果您在 Google 视频上搜索“手指轻弹技术”或 点击此处,您应该能够观看视频。
我会持续更新此页面,以发布主要版本。您也可以 查看我的博客以获取最新的预发布版本。

底部的图片显示了多选模式。相机上显示效果不太好。 在这里观看 Google 上的视频,动态效果更好。
Using the Code
您首先注意到的关于此应用程序的一点是它滚动的方式非常流畅。这是由于在重写的 OnPaint
和 OnPaintBackground
事件中完成的屏幕外缓冲。
基本上,屏幕外缓冲或双缓冲是通过在位图中绘制表单,然后将该位图绘制到表单上来实现的。这限制了实际图形命令的数量,并提高了绘制速率。
bool paint = false;
Bitmap BackScreen = null;
protected override void OnPaint(PaintEventArgs e)
{
if (paint)
{
if (BackScreen == null)
{
BackScreen = new Bitmap(ClientSize.Width, ClientSize.Height);
}
Brush brush = new SolidBrush(Color.Black);
Graphics g = Graphics.FromImage(BackScreen);
g.Clear(Color.White);
for (int i = 0; i < FakeLabels.Length; i++)
{
g.DrawString(ListData[i], this.Font, brush, 0, FakeLabels[i]);
}
e.Graphics.DrawImage(BackScreen, 0, 0);
paint = false;
}
}
关注点
该项目还演示了如何使用 P/Invoke 执行 Win32 DLL 调用。其中一个 DLL 调用绘制渐变,这是一个每个人都应该在代码片段中掌握的简单技巧。
滚动效果实际上是一种视觉错觉。标签以循环方式向上或向下移动,并且文本在恰当的时间移动以欺骗您的眼睛……理论上是这样。由您来判断。
历史
最初的版本非常糟糕。第二个版本也好不了多少,以此类推。最新的版本是朝着正确的方向迈出的又一步,但它还没有达到所需的水平。