Android Gallery控件 - 需要无限循环的图像

时间:2011-02-15 20:08:24

标签: android image-gallery

如果不从图像堆栈的中间开始,如何在无限循环中从左到右,从右到左旋转它们?我尝试了setSelection(position),但由于某种原因,我得到的方法被调用了几次而且不一致。我的图像增量必须保存在应用程序状态中,这样会使它更复杂。

@Override
    public void setSelection(int position){

        int sectionPos = getCurrentPositionFromState();

        if (sectionPos == (this._images - 1)){  
            setCurrentPositionFromState(0);
            sectionPos = 0;
        }
        else {
            setCurrentPositionInState(sectionPos +1);
        }
        if (sectionPos <= (this._images - 1) ){
            super.setSelection(sectionPos);
        }
    }

gallery.setOnItemSelectedListener(new OnItemSelectedListener() {     
            @Override
            public void onItemSelected(AdapterView parent, View view, int position, long id) {

                gallery.setSelection(position);


            @Override
            public void onNothingSelected(AdapterView parent) {


            }
        });

我还应该提到我有一个onFling()覆盖,如:

@Override
       public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
         return super.onFling(e1, e2, 0, velocityY);
       }

2 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题,但在所有情况下,它在技术上从来都不是“无限的”。我从窥探了一段时间后得到了我的基础。

首先,我们需要将一个库放入布局中的xml文件中。所以创建文件后放入一个像这样的小片段:

<!-- Gallery To show images Gallery  --> 
< Gallery
    android:id="@+id/galleryView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingBottom="15dip"/>

现在让我们设置一个不同图像的矢量,这样我们就可以循环播放了。我们将从我们的资源中获取这些图像,但是如果您想从其他地方获取它们,那么只需插入它即可。我们将把它插入到onCreate()中。这将允许我们有一个id的向量,我们可以在以后将图像放入图库时参考:

public Vector<Integer> mPhotoVector = new Vector<Integer>();

public void setPhotos() {
    for(as many photos as you want){
        int imageResource = getResources().getIdentifier("imageNAme", "drawable", getPackageName());
        mPhotoVector.add(imageResource);
    }

其中galView是布局中的图库视图。当我们完成这个项目时,我们需要从xml调用库视图并将其初始化为我们将在代码中的库变量。

LoopingGalleryAdapter adapter;
Gallery galView;

adapter = new LoopingGalleryAdapter(this, mPhotoVector);
galView = (LoopingGallery)mLayoutView.findViewById(R.id.galleryView);
galView.setAdapter(adapter);
galView.setSelection((galView.getCount() / 2));

setSelection()让我们看着画廊的中间,这使它看起来是“无限的”,因为现在每边都有1073741823个元素。

接下来我们需要创建适配器。基础是创建最大的图库,接下来我们只需添加我们自己的小getCount方法。这将创建一个太大而无法让用户(可能)滚动到结尾的图库。

最后在适配器上我们有项目的主要内容,要求我们设置我们的位置。这是关键。一旦将位置设置为图库的中间位置,就好像你的两边都有无限的图像循环。

我开始有点像这样:

public class LoopingGalleryAdapter extends BaseAdapter {

     private ImageView iv;
     private Context mContext;
     public PhotoVector mPhotoVector = null;
     int mGalleryItemBackground;

      public LoopingGalleryAdapter(Context c, PhotoVector aVector) {
          this.mContext = c;
          mPhotoVector = aVector;
      }

      public int getCount() {
        return Integer.MAX_VALUE;
      }

      @Override
      public Object getItem(int position) {
          return position;
      }

      public ImageView getImage(){
        return iv;
      }

      @Override
      public long getItemId(int position) {
          return position;
      }

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
          iv = new ImageView(mContext);
          private final int middle = 1073741823; //this is the middle index of the gallery in galView 

          /************************************************************************
          *if you have a vector/array/arrayList of photos you would like to display
          ************************************************************************/
          if((position - middle) >= 0) { relativePosition = (position-middle) % mPhotoVector.size(); }
          else { relativePosition = mPhotoVector.size() - (Math.abs(position - middle) % mPhotoVector.size()); }

          Drawable draw = mContext.getResources().getDrawable(mPhotoVector.get(relativePosistion));

          /*********************************************
          *otherwise you can just insert a photo like so
          *********************************************/
          Drawable draw = mContext.getResources().getDrawable(R.drawable.what_you_want);

          iv.setImageDrawable(draw);
          return iv;
      }
}

我们现在已经完成了!

此外,我发现其中一个非常有用的技巧,如果在从互联网上获取图像时没有必要,那就是计算你经过getView()的次数,并在清除了10-20次之后缓存,这样你就不会抛出OutOfMemoryError

   if(counter >= 20){
       galView.destroyDrawingCache();
       counter = 0;
   }

或让getView()抛出OutOfMemoryError,抓住它并返回一个空的ImageView(iv),然后清除然后调用galView.destroyDrawingCache();

答案 1 :(得分:0)

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

http://blog.blundellapps.com/infinite-scrolling-gallery/

也可以下载源代码,选择图像大小。

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