我正在考虑如何在 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);

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top