Android горизонтальная прокрутка ведет себя как iPhone (пейджинг)
У меня есть LinearLayout внутри HorizontalScrollView. Содержание это просто изображение. Во время прокрутки мне нужно добиться того же поведения, которое вы получаете при установке параметра подкачки на iPhone, эквивалентном HSW (прокрутка списка должна останавливаться на каждой странице списка, а не продолжать движение).
Как это делается в Android? Должен ли я реализовать эти функции самостоятельно или есть конкретное свойство для установки или подкласс HSV для реализации?
4 ответа
Итак, мое решение:
- Перехватить событие onTouch и рассчитать, должна ли страница перейти на следующую или сохранить текущую
- Унаследовать от 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, найденная здесь:
Это может показаться излишним только из-за использования его на изображениях, но это решение допускает бесконечное разбиение по страницам с небольшим фокусом (т. Е. Когда на первой странице вы можете прокрутить назад до последней страницы, а когда на последней странице вы можете прокрутить вперед до первой страницы)). Это также позволяет вам иметь неизвестное количество страниц и динамически генерировать контент, используя еще одну маленькую хитрость. Пожалуйста, смотрите мой комментарий во второй ссылке здесь
для деталей о том, как я достиг этого.
Надеюсь это поможет.
Новый пакет совместимости (редакция 3) в Android добавил ViewPager, который делает это.
Я нашел другой способ получить тот же эффект, и я думаю, что это более читабельно. Вот путь:
@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;
}