我正在思考如何在android中滚动“无限”,类似缩放的控件的替代方案。简单的想法是重绘每个滚动运动的整个视图,但不知何故它似乎不是正确的方式。可以事先绘制内容,但我不知道我应该在多大程度上创建视图,以及当用户滚动到视图末尾时会发生什么?我想我需要将观点扩展到这个方向。
我应该以编程方式添加(和删除)视图块到线性布局吗?很高兴听到有关绘制这种长卷轴自定义控件的经验。
由于 /埃里克
答案 0 :(得分:1)
使用与您的控件大小相同的屏幕外缓冲区。
首先以简单的方式做到这一点。将整个屏幕外缓冲区滚动到正确的位置。当准备好blit到实际屏幕时。
如果速度太慢,请尝试通过不重绘整个屏幕外缓冲来优化它,但要进行垂直分割:(我现在只讨论水平滚动运动,以使概念更容易掌握。但是这个方法也适用于8路滚动)
这实现起来有些棘手(这就是为什么我首先提出了简单的方法),但是试着想象一张带有图片的纸张,并将左侧环绕并粘贴到右侧(所以你得到了一个管)。这样,您可以无限期地滚动纸张(通过围绕y轴旋转管道)。
类似地,您可以对屏幕外缓冲区执行相同的操作。通过在屏幕缓冲区上绘制完整内容来准备它。
现在向右滚动你基本上将屏幕外缓冲区拆分为2(通过这个垂直分割(就像胶水所在的例子中的纸张))。假设您向右滚动10个像素,您所做的是:
在你这样做之前只重绘已被改变的像素(在这种情况下,因为我们滚动了10个像素,所以是10个像素)。所有其他像素仍然相同,不需要重绘。
你必须自己在纸上画出来才能真正理解它。在资源有限的平台(手机等)上进行游戏开发是一种非常常见的技术。
P.S。所有方向的滚动都可以用完全相同的方式实现(虽然它更难以正确); ^)
答案 1 :(得分:1)
如果你正在使用list / grid或任何使用Adapter for data的东西,你可以使用CommonsWare编写的最优秀的类,可以在这里找到:
http://github.com/commonsguy/cwac-endless
它专门用于此目的
答案 2 :(得分:1)
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);
}