1

我正在考虑如何在 android 中滚动“无限”、类似比例的控件的替代方案。简单的想法是在每次滚动移动时重新绘制整个视图,但不知何故,这似乎不是正确的方法。可以预先绘制内容,但我不知道首先应该使视图有多宽,以及当用户滚动到视图末尾时会发生什么?我想我需要将视野扩大到那个方向。

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

谢谢/埃里克

4

4 回答 4

1

使用控件大小的屏幕外缓冲区。

首先做简单的方法。绘制滚动到正确位置的整个 offscreenbuffer。准备好后将其传送到实际屏幕。

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

这实现起来有点棘手(这就是为什么我首先建议使用简单的方法),但试着想象一张上面有图片的纸,然后将左侧包裹起来并将其粘在右侧(这样你就得到了一个管子)。通过这种方式,您可以无限期地滚动纸张(通过围绕它的 y 轴旋转管子)。

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

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

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

在您执行此操作之前,仅重绘要更改的像素(在本例中为 10 个像素,因为我们滚动了 10 个像素)。所有其他像素仍然相同,不需要重绘。

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

ps 向各个方向滚动可以以完全相同的方式实现(尽管更难做到正确);^)

于 2009-10-17T15:01:08.743 回答
1

如果您正在使用列表/网格或任何使用适配器的数据,您可以使用由 CommonsWare 编写的最优秀的类,可在此处获得:

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

这是专门为此目的

于 2009-10-18T10:55:20.180 回答
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);

    }



}
于 2012-02-04T19:47:38.570 回答
0

在 XML 中怎么样?私人无效drawEndlessBackground(帆布画布,向左浮动,浮动顶部){

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);

}
于 2016-09-14T01:34:54.273 回答