如何在 Android 中滚动“无限”宽视图?
-
21-09-2019 - |
题
我正在考虑如何在 android 中滚动“无限”、类似比例的控件的替代方案。简单的想法是在每次滚动移动时重新绘制整个视图,但不知怎的,这似乎不是正确的方法。可以预先绘制内容,但我不知道我应该首先将视图设置为多宽,以及当用户滚动到视图末尾时会发生什么?我想我需要将视野扩展到那个方向。
我应该以编程方式向线性布局添加(和删除)视图块吗?很高兴听到有关绘制这种长滚动自定义控件的经验。
谢谢 /埃里克
解决方案
如果您正在使用列表/网格或任何使用 Adapter 获取数据的内容,您可以使用 CommonsWare 编写的最优秀的类,可在此处找到:
http://github.com/commonsguy/cwac-endless
就是专门为了这个目的
其他提示
使用与控件大小相同的屏幕外缓冲区。
首先用简单的方法来做。将整个离屏缓冲区绘制滚动到正确的位置。准备好后将其传输到实际屏幕。
如果这太慢,请尝试通过不重绘整个离屏缓冲区而是进行垂直分割来优化它:(我现在在这里只讨论水平滚动运动,以使这个概念更容易理解。但此方法也适用于 8 向滚动)
这实施起来有点棘手(这就是为什么我首先建议使用简单的方法),但尝试想象一张上面有图片的纸,然后将左侧包裹起来并将其粘到右侧(这样您就得到了一根管子)。这样你就可以无限地滚动纸张(通过绕其 y 轴旋转管子)。
同样,您可以对离屏缓冲区执行相同的操作。通过在其上绘制完整的内容来准备离屏缓冲区。
现在向右滚动,您基本上将屏幕外缓冲区分成 2 个(通过这种垂直分割(就像示例中胶水所在的纸张一样))。假设你向右滚动 10 个像素,你要做的是:
- 将分割的右侧(位于像素 10)复制到控件的像素 0。(因此整个区域从 (10, 0) - (宽度 - 高度) 到:(0,0)
- 然后复制分割的左侧:像素 0 到 10 到像素宽度-10。所以:(0,0)-(10,高度) 到 (宽度-10, 0)
在执行此操作之前,仅重新绘制已更改的像素(在本例中为 10 个像素,因为我们滚动了 10 个像素)。所有其他像素仍然相同,不需要重新绘制。
你必须自己把它画在纸上才能真正理解它。这是在资源有限的平台(手机等)上进行游戏开发的一种非常常见的技术。
附注可以用完全相同的方式实现向各个方向滚动(尽管更难做到正确);^)
参加聚会有点晚了,但我想我应该向您展示一种更简单的方法:您只需要背景所在视图的屏幕大小或大小,然后调用以下代码(假设您正在扩展视图并覆盖 onDraw):
private void drawEndlessBackground(Canvas canvas, float left, float top) {
float modLeft = left % screenWidth;
canvas.drawBitmap(backgroundImage, modLeft, top, null);
if (left < 0) {
canvas.drawBitmap(backgroundImage, modLeft + screenWidth, top, null);
} else {
canvas.drawBitmap(backgroundImage, modLeft - screenWidth, top, null);
}
}
在 XML 中怎么样?私人无效drawEndlessBackground(Canvas画布,向左浮动,向顶部浮动){
float modLeft = left % screenWidth;
canvas.drawBitmap(backgroundImage, modLeft, top, null);
if (left < 0) {
canvas.drawBitmap(backgroundImage, modLeft + screenWidth, top, null);
} else {
canvas.drawBitmap(backgroundImage, modLeft - screenWidth, top, null);
}