Прокрутить галерею на следующую страницу - PullRequest
3 голосов
/ 18 февраля 2011

Использование виджета. Галерея для отображения горизонтально прокручиваемого списка предметов. Я реализовал разбиение на страницы в галерее с помощью стандартной техники: создайте подкласс Gallery и реализуйте:

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (velocityX>0) {
            onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null);
        } else {
            onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
        }
}

При нажатии на галерею у меня появляются кнопки следующего и предыдущего изображения. При их нажатии я хочу, чтобы галерея была анимирована на следующую / предыдущую страницу соответственно. Я пытался вызвать onKeyDown из моего обработчика следующей кнопки, но странным образом это не имеет никакого эффекта. AbsSpinner имеет setSelection(int position, boolean animate), но анимация игнорируется в Галерее.

Ответы [ 3 ]

2 голосов
/ 06 января 2012

В точности то, что сказал Тукан, но для дальнейшего уточнения (ограничения комментариев слишком короткие):

Проблема заключается в том, что Gallery не позволяет пользователю прокручиваться, если в нем нет детей.эта позиция еще.scrollToChild() является виновником при попытке ввести событие:

private boolean scrollToChild(int childPosition) {
    View child = getChildAt(childPosition);

    if (child != null) {
        int distance = getCenterOfGallery() - getCenterOfView(child);
        mFlingRunnable.startUsingDistance(distance);
        return true;
    }

    return false;
}

Интересно, что если вы бросите галерею пальцами, это приведет к созданию ребенка.Затем, если вы отпустите палец (возвращаясь к исходному положению) и , затем нажмите кнопку, которая активирует инъекцию onKeyDown, , она будет работать без сбоев - потому чтотам есть ребенок.

К сожалению, нет реального решения, поскольку в этом классе все приватно.Единственное решение - использовать setSpacing(-1) или что-то в галерее, поэтому левый и правый дочерние элементы всегда создаются и видны, но прямо за выбранным в данный момент видом.

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

Редактировать (август 2012 г.): Для дальнейшего использования, а не пытаться использовать Галерею для такого родашаблон (когда вы хотите, чтобы пользователь проводил между различными элементами, пока виден только один из них), гораздо лучше использовать ViewPager в пакете совместимости Android *1023* класс .На мой взгляд, пакет совместимости отмечен не так хорошо, как следовало бы (мне потребовалось некоторое время, чтобы заметить это).Для разработчиков, ориентированных на Android 2.x +, это находка.

2 голосов
/ 17 марта 2011

это работает

создать 2 кнопки изображений и галерею, например: nextbtn, backbtn и gall

код кнопки доступен здесь

nextbtn.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        gall.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
    }
});

backbtn.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        gall.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null);
    }
});         
0 голосов
/ 22 марта 2013
    String strMethod = velocityX > 0 ? "movePrevious" : "moveNext";
    try {
        Method method = Gallery.class.getDeclaredMethod(strMethod, null);
        method.setAccessible(true);
        method.invoke(this, null);
    } catch (Exception e) {
        e.printStackTrace();
    }
...