Как прокрутить анимацию программно - PullRequest
9 голосов
/ 27 сентября 2010

Я пытаюсь реализовать анимацию прокрутки для галереи программно.

Попытка с setSelection(int pos, Boolean animate), и она не работает.

Есть ли способ переопределить setSelection() метод.

Ответы [ 5 ]

12 голосов
/ 23 января 2012

Только сейчас у меня есть эта проблема.Мне нужно было переместить только один элемент галереи, поэтому лучшим решением для меня было эмулировать событие нажатия клавиши

myGallery.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);

или

myGallery.onKeyDown(KeyEvent.KEYCODE_DPAD_LEFT, null);
6 голосов
/ 20 июня 2011

Основано на превосходных взглядах Курру на симуляцию нажатия на следующий или предыдущий вид.

//scroll forward or backward
private void scroll(int type){
    View selectedV = mG.getSelectedView();
    int idx = mG.indexOfChild(selectedV);
    switch(type){
        case FORWARD:
    default:
        if(idx<mG.getChildCount()-1)
            idx++;
        break;
    case BACKWARD:
        if(idx>0)
            idx--;          
        break;
    }
    //now scrolled view's child idx in gallery is gotten
    View nextView = mG.getChildAt(idx);
    //(x,y) in scrolled view is gotten
    int x = nextView.getLeft()+nextView.getWidth()/2;
    int y = nextView.getTop()+nextView.getHeight()/2;
    String out = String.format("x=%d, y=%d", x, y);
    Log.i(TAG+".scroll", out);

    //Kurru's simulating clicking view
    MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0);
    mG.onDown(event); 
    boolean res = mG.onSingleTapUp(null);
    Log.i(TAG+".scroll", "onSingleTapUp return =" + res);       
}
6 голосов
/ 27 сентября 2010

Gallery.setSelection (int position, boolean animate);

См. Ниже URL: http://groups.google.com/group/android-developers/browse_thread/thread/9140fd6af3061cdf/7f89e53ae53e455b?lnk=gst&q=setselection#7f89e53ae53e455b

SOLN: Если вы все еще ищете, у меня есть два возможных решения для вас, оба немного неприятно:

(1) Вы можете заставить галерею совершать бросок с выбранной скоростью, таким образом:

myGallery.onFling (ноль, ноль, скорость, 0);

Изменяя скорость, вы можете установить значения для перемещения выделения на один или два в любом направлении. Как самоцентры Галереи, вы делаете не нужно точно определять пункт назначения.

(2) Поскольку источник «Галерея» доступен, его можно изменить, чтобы реализовать свою собственную галерею. Не похоже, что вам нужно добавить много кода, чтобы иметь возможность контролировать бросок, чтобы закончить на выбранном вами выбор.

Я думал, что собираюсь сделать (2), но обнаружил, что могу уйти с (1) для моей проблемы.

2 голосов
/ 12 мая 2011

Я немного изменил код, указанный "Курру".это работает сейчас

Rect rect = new Rect();
    gallery.getHitRect(rect);

    int width = Math.abs(rect.width());
    if(!isForwardScroll){
        width = width * -1;
    }
    int x = rect.centerX()+width/2;
    int y = rect.centerY();

    MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0);
    gallery.onDown(event);
    boolean res = gallery.onSingleTapUp(null);
2 голосов
/ 23 февраля 2011

Я просматривал источник в Галерее, чтобы узнать, смогу ли я получить эту функцию. Похоже, что-то возможно с этим кодом. Однако я сдался, прежде чем я смог заставить его работать. Кажется, я не передал правильные координаты, поэтому res всегда возвращал false. Вернул бы true, если бы это работало.

Просто опубликуйте это здесь на тот случай, если кто-то еще захочет попробовать это исправить! (Пожалуйста, опубликуйте свое решение, если вам это удастся!)

Rect rect = new Rect();
gallery.getHitRect(rect);


int x = rect.centerX()+getWindowManager().getDefaultDisplay().getWidth();
int y = rect.centerY();

MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0);
timesGallery.onDown(event);
boolean res = timesGallery.onSingleTapUp(null);
...