Android горизонтальная прокрутка ведет себя как iPhone (пейджинг) - PullRequest
29 голосов
/ 07 апреля 2010

У меня есть LinearLayout внутри HorizontalScrollView. Содержание это просто изображение. Во время прокрутки мне нужно добиться того же поведения, которое вы получаете при установке параметра подкачки на iPhone, эквивалентном HSW (прокрутка списка должна останавливаться на каждой странице списка, а не продолжать перемещение).

Как это делается в Android? Должен ли я реализовать эти функции самостоятельно или есть конкретное свойство для установки или подкласс HSV для реализации?

Ответы [ 4 ]

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

Я нашел хорошее решение здесь:

Горизонтальный пейджер

это очищенная версия кода GitHub, найденная здесь:

Переключатель реального вида

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

для получения подробной информации о том, как я это сделал.

Надеюсь, это поможет.

15 голосов
/ 19 июля 2011

В новый пакет совместимости (редакция 3) в Android добавлен ViewPager, который делает это.

http://developer.android.com/sdk/compatibility-library.html

13 голосов
/ 08 апреля 2010

Итак, мое решение:

  1. Перехватить событие onTouch и рассчитать, должна ли страница перейти на следующую или сохранить текущее
  2. Наследовать от HorizontalScrollView и переопределить методcomputeScroll

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

Код для обработчика событий:

_scrollView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP)
            {
                float currentPosition = _scrollView.getScrollX();
                float pagesCount = _horizontalBar.getChildCount();
                float pageLengthInPx = _horizontalBar.getMeasuredWidth()/pagesCount;
                float currentPage = currentPosition/pageLengthInPx;

                Boolean isBehindHalfScreen =  currentPage-(int)currentPage > 0.5;

                float edgePosition = 0;
                if(isBehindHalfScreen)
                {
                    edgePosition = (int)(currentPage+1)*pageLengthInPx;
                }
                else
                {
                    edgePosition = (int)currentPage*pageLengthInPx;
                }

                _scrollView.scrollTo((int)edgePosition, 0);
            }

            return false;
        }
    });

И в моем унаследованном HorizontalScrollView

@Override
    public void  computeScroll  (){
        return;
    }
0 голосов
/ 15 марта 2012

Я нашел другой способ получить тот же эффект, и я думаю, что он более читабелен.Вот путь:

@Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP)
            {
                float currentPosition = hsv.getScrollX();
                float pagesCount = hsv.getChildCount();
                float pageLengthInPx = hsv.getMeasuredWidth()/pagesCount;

                int page = (int) (Math.floor((currentPosition - pageLengthInPx / 2) / pageLengthInPx) + 1);
                hsv.scrollTo((int) (page * pageLengthInPx), 0);
            }

            return false;
        }
...