Как реализовать бесконечную галерею в Android? - PullRequest
9 голосов
/ 03 августа 2010

Я использую макет галереи в своем приложении.Это работает, когда пользователь перемещает изображения в галерее слева направо (это бесконечно, что означает, что элементы повторяются снова).Но когда пользователь перемещается справа налево и достигает первого элемента, это не так.После этого никакие элементы не приходят.Но я хочу повторить элементы и с этой стороны.Можете ли вы дать мне несколько советов?

 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

Как сделать круговой вид моей галереи?Я могу делать это слева направо бесконечно, но когда я перетаскиваю справа налево, это показывает конечную точку.

Ответы [ 5 ]

17 голосов
/ 03 августа 2010

В 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.

12 голосов
/ 20 августа 2010

Если кто-то хотел, чтобы это также пошло в обратном направлении, вы можете реализовать это.Все, что он действительно делает, это запускает галерею посередине.

GalleryName.setSelection((int)( Integer.MAX_VALUE / 2 ) - ( Integer.MAX_VALUE / 2 ) % mImageIds.length);
4 голосов
/ 19 мая 2011

Код адаптера для объяснения Риса можно найти здесь: круговая галерея андроида?

просто убедитесь, что воспользовались предложением гоготи, чтобы переместить начальный выбор в середину диапазона,(так что вы можете прокручивать влево и вправо почти всегда).Например, я сделал это так:

@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 голосов
/ 27 февраля 2014

Чтобы сделать первый элемент центром доступного массива:

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

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

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

http://blog.blundell -apps.com / бесконечная прокрутка-галерея /

Я использую те же математические модули, что и @reece, также можно загрузить исходный код.

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

...