Галерея прокручивает одно изображение за раз - PullRequest
1 голос
/ 14 января 2011

как заставить галерею управлять прокруткой по одному изображению за раз?Также, каков хороший способ сделать непрерывный цикл этих изображений?Я попытался переопределить onFling, не работает вообще.

Это перемещает изображение на определенное расстояние, но на самом деле не реализует "истинный пейджинг".

@Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

          //  return super.onFling(e1, e2, velocityX, velocityY);
            int kEvent;
              if(isScrollingLeft(e1, e2)){ //Check if scrolling left
                kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
              }
              else{ //Otherwise scrolling right
                kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
              }
              onKeyDown(kEvent, null);
              return true;  
        }
        private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){
              return e2.getX() > e1.getX();
            }

Ответы [ 3 ]

9 голосов
/ 15 февраля 2011

Я создал новый элемент управления, назвал его CustomGallery и расширил его из Gallery. В Custom Gallery я поместил следующее:

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

В своей деятельности я использую CustomGallery вместо Gallery. Это работает. Одно мы перешли с 2.2 на 2.3 (пряники). Это не сработало для меня раньше, когда я пытался переопределить onFling. Так что я подозреваю, что это также как-то связано с версией ОС.

5 голосов
/ 14 декабря 2012

Решение Аникет Авати сработало для меня лучше всего. Однако я бы предложил усовершенствовать, чтобы в некоторых случаях не прокручивалось два предмета.

int mSelection = 0;

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    boolean leftScroll = isScrollingLeft(e1, e2);
    boolean rightScroll = isScrollingRight(e1, e2);

    if (rightScroll) {
        if (mSelection != 0)             
            setSelection(--mSelection, true);
    } else if (leftScroll) {

        if (mSelection != getCount() - 1)
            setSelection(++mSelection, true);
    }
    return false;
}
3 голосов
/ 30 декабря 2011

Это работает все время.на всех версиях в обязательном порядке для меня.

    private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {
    return e2.getX() < e1.getX();
}

private boolean isScrollingRight(MotionEvent e1, MotionEvent e2) {
    return e2.getX() > e1.getX();
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    boolean leftScroll = isScrollingLeft(e1, e2);
    boolean rightScroll = isScrollingRight(e1, e2);

    if (rightScroll) {
        if (getSelectedItemPosition() != 0)             
            setSelection(getSelectedItemPosition() - 1, true);
    } else if (leftScroll) {

        if (getSelectedItemPosition() != getCount() - 1)
            setSelection(getSelectedItemPosition() + 1, true);
    }
    return true;
}
...