2010-08-03 303 views
9

我在应用程序中使用画廊布局。当用户从左到右移动画廊中的图片时(它是无限的,意味着元素再次被重复),它正在工作。但是,当用户从右向左移动并到达第一个元素时,它不会。之后没有元素来临。但我想重复这方面的元素。你能给我一些建议吗?如何在Android中实现无尽的画廊?

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

我怎样才能让我的画廊是圆形的?我可以无限地从左到右做,但是当我从右向左拖动时,它显示了终点。

回答

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; 

应为positionmImageIds.length值无关的所有值工作。

+0

thanku for respond reece我放置这段代码最后一张图片添加继续图片工作正常,但不添加第一张图片0位置添加-21 -20 -19 ....我前锋一些截图第一张图片前面没有添加图片(空白)http://www.freeimagehosting.net/image.php?d816500473.png – Narasimha 2010-08-03 07:39:56

+0

对不起,我不明白你的意思 - 你是否将位置<0 case添加到checkPosition? – reece 2010-08-03 08:20:17

+0

是在图库中的第一张图片之前没有添加到最后的图片 及其显示第一张图片后的空白空间 循环次序我是4图像顺序(返回... 3 0 1 2 3 0 1 2 3 0 1 .. ...前面)这个循环顺序前台后台工作正常后台不工作 – Narasimha 2010-08-03 08:49:35

12

如果有人想让它也倒退,你可以实现这个。所有它确实是它在中间开始画廊。

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

喜gogothee画廊在完美的工作thanku但一个问题是有图像旋转一个接一个,但画廊不rotatiing我会粘贴保存上面的代码请解决这个旋转我适用于处理器 – Narasimha 2010-08-20 10:12:36

+0

非常感谢gogothee其工作正常 – Narasimha 2010-08-20 14:31:12

+0

画廊中第一个元素的位置总是如此吗? – Veljko 2012-03-03 21:38:34

4

对里斯的解释适配器代码可以在这里找到: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);