我在我的应用程序中使用了库布局。当用户从左到右移动图库中的图片时它正在工作(它是无限的,意味着元素再次重复)。但是当用户从右向左移动并到达第一个元素时,它不会。之后就没有元素了。但是我也要重复这一方面的要素。你能给我一些建议吗?
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();
}
}
});
}
如何让我的图库视图为圆形?我可以无限地从左到右进行,但是当我从右向左拖动时,它显示了终点。
答案 0 :(得分: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;
应该适用于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);