Подтвердить что ты не робот

Android горизонтальный scrollview ведет себя как iPhone (пейджинг)

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

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

4b9b3361

Ответ 1

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

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

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

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

_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;
    }

Ответ 2

Я нашел здесь приятное решение:

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

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

Real View Switcher

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

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

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

Ответ 4

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

@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;
        }