如何在Android中实现无尽的画廊?

时间:2010-08-03 05:59:00

标签: android gallery adapter

我在我的应用程序中使用了库布局。当用户从左到右移动图库中的图片时它正在工作(它是无限的,意味着元素再次重复)。但是当用户从右向左移动并到达第一个元素时,它不会。之后就没有元素了。但是我也要重复这一方面的要素。你能给我一些建议吗?

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

                }
            });


        }

Screenshot Frontgallery

如何让我的图库视图为圆形?我可以无限地从左到右进行,但是当我从右向左拖动时,它显示了终点。

5 个答案:

答案 0 :(得分:17)

在getView中:

if(position>21){
    position=0;
}

这应该被删除,因为它应该由ch​​eckPosition函数处理。

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

应该适用于position的所有值,而不管mImageIds.length的值。

答案 1 :(得分:12)

如果有人想让它也倒退,你可以实现这一点。所有这一切真的是在中间开始画廊。

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

答案 2 :(得分: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() ) );
}

答案 3 :(得分:0)

一个无耻的自我插件,刚写了一篇无限滚动画廊教程:

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

我使用与@reece相同的modulas数学,也可以下载源代码。

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

答案 4 :(得分: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);