你介意垂直滚动吗?
我会以DataGridView控件为基础,创建以下实现:
创建自定义列和单元格类型,派生自DataGridViewImageColumn。您可以称它们为“CronosNetImageColumn”、“CronosNetImageCell”。
2)创建类“CronosImageDetails”来保存单元格数据(包括用于显示文本和图像URL的属性)。这将作为每个单元格的值传递。例如:
ImageGrid.Rows.Add(new CronosImageDetails { DisplayText="沙滩度假", ImageURL="http://...beach.jpg" });
3)重写单元格的Paint()函数,使用WebClient获取图像,并使用e.Graphics.DrawImage(ImageObtainedFromWebClient)将图像绘制到单元格上。您可以使用e.Graphics.DrawString((CronosImageDetails)value.DisplayText,...)在单元格中覆盖文本。
这个快速解决方案将为您提供一个滚动图像列表,只有当用户滚动列表时才加载图像,并为改进提供了一个坚实的基础。
建议进行进一步的优化:
A) 创建一个后备缓冲位图和绘制单元格数据的图形。
将Paint()的设置更改为只需绘制后备缓冲区而不需要获取图像。
创建一个新的单元格方法LoadImage(),
它会产生一个新的线程,
下载该图像并将其绘制到后台缓冲区中。
请用Java代码实现:利用Paint()(或单独的帮助程序线程)跟踪滚动的方向和加速度,并估计需要预加载哪些单元格。对这些单元格触发LoadImage()。
E) 将每个单元格的后备缓冲区初始化为加载图像。
F)从图像加载时间跟踪和使用经验数据,以帮助确定哪些单元需要预加载。