Управление галереей Android - нужен бесконечный цикл изображений
Не начиная с середины стопки изображений, как мне повернуть их в бесконечном цикле слева направо и справа налево? Я пробовал 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 ответа
Есть несколько способов сделать это, но во всех случаях это технически никогда не "бесконечно". Я получил основание от того, что присматривал некоторое время.
Сначала нам нужно поместить галерею в 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();
Бесстыдный самоподключатель, только что написал учебник Бесконечной прокрутки:
http://blog.blundellapps.com/infinite-scrolling-gallery/
Исходный код также можно скачать, вы выбираете размер изображения.
Вы можете использовать изображения на вашей SD-карте или изображения в каталоге /resources/drawable.