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

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

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

4 ответа

Решение

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

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

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

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

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

Real View Switcher

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

для деталей о том, как я достиг этого.

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

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

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

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

@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;
        }
Другие вопросы по тегам