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

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

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

29
задан digidigo 10 December 2013 в 23:00
поделиться

1 ответ

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

  1. Перехватить событие onTouch и вычислить, должна ли страница измениться на следующую или оставить текущую
  2. Наследовать из 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;
    }
13
ответ дан 28 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: