Как реализовать бесконечную галерею в 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();
}
}
});
}
Как я могу сделать круговой вид галереи? Я я могу делать это слева направо бесконечно, но когда я перетаскиваю справа налево, он показывает конечную точку.
5 ответов
в 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
.
Если кто-то хотел, чтобы он также пошел назад, вы можете реализовать это. Все, что он действительно делает, это начинает галерею посередине.
GalleryName.setSelection((int)( Integer.MAX_VALUE / 2 ) - ( Integer.MAX_VALUE / 2 ) % mImageIds.length);
код адаптера для объяснения риса можно найти здесь:круговая галерея для Андроид?
просто не забудьте использовать предложение 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() ) );
}
бесстыдная самостоятельная вилка, просто написал бесконечную прокрутку галереи учебник:
http://blog.blundell-apps.com/infinite-scrolling-gallery/
Я использую те же математические модули, что и @reece, исходный код также можно загрузить.
вы можете использовать изображения на SD-карте или изображения в каталоге /resources/drawable
чтобы сделать первый элемент центром доступного массива:
your_gallery_obj.setSelection ((int) (целое число.MAX_VALUE / 2) - (целое число.Массив / 2 ) % your_array_size);
чтобы сделать средний элемент центром доступного массива:
your_gallery_obj.setSelection ((int) (целое число.Массив/2) + (число.Массив/2) % your_array_size);