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

Мне нужно реализовать галерею, которая прокручивает по одному элементу за раз, и которая может выполнять «автопрокрутку»: то есть каждые пару секунд она автоматически прокручивается до следующего элемента.

Согласно этой теме: Android: программно анимировать между изображениями в виджете «Галерея» , я расширил «Галерея», переопределив onFling , чтобы игнорировать событие броска и вместо этого имитировать стрелку DPAD влево или вправо чтобы переместить один предмет за раз:

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float 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; 
    }

Это хорошо работает. Для автоматической прокрутки я создаю обработчик и postDelayed исполняемый файл, который имитирует одинаковое нажатие клавиши DPAD таким же образом:

handler.postDelayed(new Runnable() {
    public void run() { 
        onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
    }
}, AUTO_SCROLL_INTERVAL);

но это ничего не делает !!

Я знаю, что исполняемый файл исполняется, как и ожидалось, с правильным интервалом, поскольку я зарегистрировал его и подтвердил это, но onKeyDown не заставляет галерею прокручивать или переключать элементы. Почему это работает в одном методе, а не в другом? Вместо этого я попытался позвонить на onFling , но безрезультатно Также попытался dispatchKeyEvent , но не повезло.

Мне действительно нужно это запустить, но я также очень хочу понять, почему один и тот же код не дает одинаковых результатов в двух разных местах ... Это как-то связано с тем, как представления Android обрабатывают события ввода? Я искал код галереи для подсказок, но ничего не нашел! Кажется, что это должно работать.

Пожалуйста, я в тупике ... есть идеи?

Спасибо

Ответы [ 3 ]

4 голосов
/ 17 ноября 2011

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

Спасибо за вашу помощь HighFlyer:)

По крайней мере, я узнал об отражении ... которое является очень интересной функцией Java.

public class CustomGallery extends Gallery {

    private Handler handler;

    public CustomGallery(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        handler = new Handler();
        postDelayedScrollNext();
    }

    private void postDelayedScrollNext() {
        handler.postDelayed(new Runnable() {
            public void run() {
                postDelayedScrollNext();
                Log.d("CustomGallery", "dpad RIGHT");
                onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
            }
        }, 1000);
    }

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

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        int kEvent;
        if (isScrollingLeft(e1, e2)) {
            Log.d("CustomGallery", "fling LEFT");
            kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
        } else {
            Log.d("CustomGallery", "fling LEFT");
            kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
        }
        onKeyDown(kEvent, null);
        return true;
    }
2 голосов
/ 17 января 2012

Примечание для будущих посетителей: лучшее решение в подобных ситуациях (полнофункциональная галерея) - использовать ViewPager. Он работает как галерея, но правильно реализует метод setCurrentItem() для плавной прокрутки. С пакетом совместимости он работает для API 4 (Android 1.6!) И выше, так что каждый может его использовать.

1 голос
/ 16 ноября 2011

Кажется, вы вызываете метод onKeyDown своей деятельности, а не галереи. Попробуйте позвонить

gallery.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null)

вместо этого. Поправь меня если я не прав

...