我正在考虑如何在 android 中滚动“无限”、类似比例的控件的替代方案。简单的想法是在每次滚动移动时重新绘制整个视图,但不知何故,这似乎不是正确的方法。可以预先绘制内容,但我不知道首先应该使视图有多宽,以及当用户滚动到视图末尾时会发生什么?我想我需要将视野扩大到那个方向。
我应该以编程方式向线性布局添加(和删除)视图块吗?很高兴听到关于绘制这种长滚动自定义控件的经验。
谢谢/埃里克
我正在考虑如何在 android 中滚动“无限”、类似比例的控件的替代方案。简单的想法是在每次滚动移动时重新绘制整个视图,但不知何故,这似乎不是正确的方法。可以预先绘制内容,但我不知道首先应该使视图有多宽,以及当用户滚动到视图末尾时会发生什么?我想我需要将视野扩大到那个方向。
我应该以编程方式向线性布局添加(和删除)视图块吗?很高兴听到关于绘制这种长滚动自定义控件的经验。
谢谢/埃里克
使用控件大小的屏幕外缓冲区。
首先做简单的方法。绘制滚动到正确位置的整个 offscreenbuffer。准备好后将其传送到实际屏幕。
如果这太慢,请尝试通过不重绘整个屏幕外缓冲区而是进行垂直分割来优化它:(我现在只讨论水平滚动移动以使概念更容易掌握。但是这种方法适用于8路滚动)
这实现起来有点棘手(这就是为什么我首先建议使用简单的方法),但试着想象一张上面有图片的纸,然后将左侧包裹起来并将其粘在右侧(这样你就得到了一个管子)。通过这种方式,您可以无限期地滚动纸张(通过围绕它的 y 轴旋转管子)。
类似地,您可以对屏幕外缓冲区执行相同操作。通过在屏幕外缓冲区上绘制完整内容来准备屏幕外缓冲区。
现在向右滚动,您基本上将屏幕外缓冲区拆分为 2(通过这种垂直拆分(就像胶水示例中的纸一样))。假设您向右滚动 10 个像素,您所做的是:
在您执行此操作之前,仅重绘要更改的像素(在本例中为 10 个像素,因为我们滚动了 10 个像素)。所有其他像素仍然相同,不需要重绘。
你必须自己在纸上画出来才能真正理解它。在资源有限的平台(手机等)上进行游戏开发是一种非常常见的技术。
ps 向各个方向滚动可以以完全相同的方式实现(尽管更难做到正确);^)
如果您正在使用列表/网格或任何使用适配器的数据,您可以使用由 CommonsWare 编写的最优秀的类,可在此处获得:
http://github.com/commonsguy/cwac-endless
这是专门为此目的
聚会有点晚了,但我想我会向您展示一个更简单的方法:您只需要背景所在视图的屏幕尺寸或大小,然后调用以下代码(假设您正在扩展查看和覆盖 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(帆布画布,向左浮动,浮动顶部){
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);
}