Android горизонтальный scrollview ведет себя как iPhone (пейджинг)
У меня есть LinearLayout внутри HorizontalScrollView. Содержимое - это просто изображение. При прокрутке мне нужно добиться того же поведения, которое вы получаете при настройке параметра подкачки на эквиваленте iPhone HSW (прокрутка списка должна останавливаться на каждой странице в списке, а не продолжать движение).
Как это делается в Android? Должен ли я реализовать эти функции самостоятельно или существует определенное свойство для установки или подкласса HSV для реализации?
Ответы
Ответ 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
Это может показаться излишним, просто используя его на изображениях, но это решение позволяет использовать бесконечный пейджинг с использованием небольшого трюка (т.е. когда на первой странице вы можете прокручивать назад до последней страницы, а на последней странице вы можете прокручивать вперед на первую страницу). Он также позволяет вам иметь неизвестное количество страниц и динамически генерировать контент, используя другой небольшой трюк. См. Мой комментарий во второй ссылке здесь
для получения подробной информации о том, как я это сделал.
Надеюсь, что это поможет.
Ответ 3
В новом пакете совместимости (версия 3) на Android добавлен ViewPager, который делает это.
http://developer.android.com/sdk/compatibility-library.html
Ответ 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;
}