如何在Android中滚动“无限”宽视图?

时间:2009-10-17 14:39:34

标签: android scroll custom-view custom-scrolling

我正在思考如何在android中滚动“无限”,类似缩放的控件的替代方案。简单的想法是重绘每个滚动运动的整个视图,但不知何故它似乎不是正确的方式。可以事先绘制内容,但我不知道我应该在多大程度上创建视图,以及当用户滚动到视图末尾时会发生什么?我想我需要将观点扩展到这个方向。

我应该以编程方式添加(和删除)视图块到线性布局吗?很高兴听到有关绘制这种长卷轴自定义控件的经验。

由于 /埃里克

4 个答案:

答案 0 :(得分:1)

使用与您的控件大小相同的屏幕外缓冲区。

首先以简单的方式做到这一点。将整个屏幕外缓冲区滚动到正确的位置。当准备好blit到实际屏幕时。

如果速度太慢,请尝试通过不重绘整个屏幕外缓冲来优化它,但要进行垂直分割:(我现在只讨论水平滚动运动,以使概念更容易掌握。但是这个方法也适用于8路滚动)

这实现起来有些棘手(这就是为什么我首先提出了简单的方法),但是试着想象一张带有图片的纸张,并将左侧环绕并粘贴到右侧(所以你得到了一个管)。这样,您可以无限期地滚动纸张(通过围绕y轴旋转管道)。

类似地,您可以对屏幕外缓冲区执行相同的操作。通过在屏幕缓冲区上绘制完整内容来准备它。

现在向右滚动你基本上将屏幕外缓冲区拆分为2(通过这个垂直分割(就像胶水所在的例子中的纸张))。假设您向右滚动10个像素,您所做的是:

  • 将分割的右手侧(位于像素10处)复制到控件的像素0。 (所以整个区域从(10,0) - (宽度 - 高度)到:(0,0)
  • 然后复制分割的左侧:像素0到10到像素宽度-10。 so:(0,0) - (10,height)to(width-10,0)

在你这样做之前只重绘已被改变的像素(在这种情况下,因为我们滚动了10个像素,所以是10个像素)。所有其他像素仍然相同,不需要重绘。

你必须自己在纸上画出来才能真正理解它。在资源有限的平台(手机等)上进行游戏开发是一种非常常见的技术。

P.S。所有方向的滚动都可以用完全相同的方式实现(虽然它更难以正确); ^)

答案 1 :(得分:1)

如果你正在使用list / grid或任何使用Adapter for data的东西,你可以使用CommonsWare编写的最优秀的类,可以在这里找到:

http://github.com/commonsguy/cwac-endless

它专门用于此目的

答案 2 :(得分:1)

派对有点晚了,但我想我会告诉你一个更简单的方法: 你只需要你的背景所在视图的屏幕大小或大小,然后调用以下代码(假设你正在扩展视图并覆盖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);

    }



}

答案 3 :(得分:0)

用XML怎么样? 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);

}