Управление галереей Android - нужен бесконечный цикл изображений - PullRequest
0 голосов
/ 15 февраля 2011

Не начиная с середины стека изображений, как вращать их в бесконечном цикле слева направо и справа налево? Я пробовал 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 ]

1 голос
/ 10 июля 2012

Есть несколько способов сделать это, но во всех случаях это никогда не бывает технически «бесконечным».Я получил основу от того, что некоторое время слонялся вокруг.

Сначала нам нужно поместить галерею в файл 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 ().Это позволит нам иметь вектор идентификаторов, на который мы сможем ссылаться при последующем размещении изображений в галерее:

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

0 голосов
/ 09 февраля 2012

Бесстыдный самоподключатель, только что написал учебник по галерее бесконечной прокрутки:

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

Исходный код также можно скачать, вы выбираете размер изображения.

Вы можете использовать изображения на SD-карте или изображения в каталоге / resources / drawable.

...