如何在Android中实现无限画廊?

9

我在我的应用程序中使用了一个画廊布局。当用户从左到右移动画廊中的图片时,它可以正常工作(这意味着元素会被重复)。但是当用户从右到左移动并到达第一个元素时,它就不再工作了。此后没有元素出现。但我希望也能从这一侧重复元素。你能给我一些建议吗?

 Gallery g = (Gallery) findViewById(R.id.gallery);
        g.setAdapter(new ImageAdapter(this));
        g.setFocusable(true);
        g.setSelection((int)(Integer.MAX_VALUE / 2) - (Integer.MAX_VALUE / 2)% mImageIds.length);        
        g.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
            {
                try {
                    imageid=position;
                    ((ImageView)findViewById(R.id.ImageViewlarge)).setImageResource(mImageIds[position]);
                    ((TextView)findViewById(R.id.TextViewImageName)).setText(imgNames[position]);
                     mp = MediaPlayer.create(SeaSpell.this,audioTrack[position]);

                        } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                }
            });


        }

前台画廊截图

如何将我的画廊视图变成圆形?我已经能够无限制地从左到右进行滑动,但是当我从右向左拖动时会显示终点。

5个回答

17
在 getView 方法中:
if(position>21){
    position=0;
}

这句话应该被移除,因为它应该被checkPosition函数处理。

在checkPosition函数中:

对于模运算符(%),给定 a % b,如果 0 <= a < b,则结果将是 a。 如果 b <= a < 2*b,则结果将是 a-b,所以如果 b == a,那么结果是 0。 对于任何正整数都是如此,所以检查应该是:

if (position > 0)
    position = position % mImageIds.length;

现在,你缺少对 position < 0 这种情况的处理。
a    a%3    a    a%3    f(a)
0    0      0    0      0
1    1     -1   -1      2
2    2     -2   -2      1
3    0     -3    0      0
4    1     -4   -1      2
5    2     -5   -2      1
6    0     -6    0      0

在这种情况下,我们希望它回到列表的末尾——上表中的f(a)
如上表所示,如果a为负数,则-b < a <= 0。此外,如果我们使f(a) = (a % b) + b,就能得到我们想要的结果。
这意味着checkPosition中的逻辑应该是:
position = position % mImageIds.length;
if (position < 0)
    position = position + mImageIds.length;

无论 mImageIds.length 的值如何,这应该适用于所有 position 的值。


感谢您的回复,Reece。我已经放置了这段代码,添加连续图像运行良好,但是在第0个位置添加第一张图像时出现问题,它添加了-21、-20、-19等图像。我将发送一些屏幕截图,第一张图像前面没有添加图像(空格)http://www.freeimagehosting.net/image.php?d816500473.png - Narasimha
对不起,我不明白你的意思 - 你是否在checkPosition中添加了位置<0的情况? - reece
是的,Reece,在画廊中第一张图片之前没有添加到最后的图片中,因此在第一张图片后显示空白空间。我采取了循环顺序,取4张图像的顺序(后...3 0 1 2 3 0 1 2 3 0 1 ...前),这个循环顺序前面的正常工作,但后面的不正常。 - Narasimha
@reece-我在使用无限画廊时遇到了一些问题,在搜索时发现了你的答案。你的回答得到了很多赞,所以我想采用你的解决方案。但是它对我来说不起作用。你能否详细说明一下或提供一些具有无限画廊功能的源代码? - Vivek Kalkur

12

如果有人想要让它也向后滚动,你可以实现这个功能。它的真正作用只是从中间开始展示画廊。

GalleryName.setSelection((int)( Integer.MAX_VALUE / 2 ) - ( Integer.MAX_VALUE / 2 ) % mImageIds.length);

嗨gogothee,谢谢你的正常工作画廊,但有一个问题就是图片轮换一个接一个,但画廊没有旋转。我将粘贴保存上面的代码,请提供一些解决方案,我正在将此旋转应用到处理程序。 - Narasimha
画廊中第一个元素的位置总是那个吗? - Veljko

4

Reece的解释的适配器代码可以在这里找到:android circular gallery?

只需确保使用gogothee的建议将初始选择移动到范围的中点。(这样你就可以左右滚动几乎无限了)。例如,我是这样做的:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout);

    //get references to UI components
    mGallery = (Gallery) findViewById(R.id.filter_gallery);

    //connect Galleries with adapters
    mGallery.setAdapter(new GalleryAdapter(this));

    //auto-select first image (position 1073741820)
    mGallery.setSelection((int)(Integer.MAX_VALUE/2) - ( (Integer.MAX_VALUE/2) % mImageBuffer.getCount() ) );
}

0

将第一个元素作为可用数组的中心:

your_gallery_obj.setSelection((int)(Integer.MAX_VALUE/2) - (Integer.MAX_VALUE/2) % your_array_size);

将中间元素作为可用数组的中心:

your_gallery_obj.setSelection((int)(Integer.MAX_VALUE/2) + (Integer.MAX_VALUE/2) % your_array_size);


0
一个不要脸的自我推销,刚写了一个无限滚动画廊教程:

http://blog.blundell-apps.com/infinite-scrolling-gallery/

我使用和 @reece 相同的模数数学,源代码也可供下载。

您可以使用存储在 SD 卡上的图像或在 /resources/drawable 目录中的图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接