So, my solution is:
- Intercept the onTouch event and calculate whether the page should change to the next or keep on the current
- Inherit from HorizontalScrollView and override the method computeScroll
The method computeScroll the called to move the list. By default I suppose it's implemented to decelerate with a certain ratio...
Since I don't want this motion, I just override it without specifing a body.
The code for the event handler is:
_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;
}
});
And in my inherited HorizontalScrollView
@Override
public void computeScroll (){
return;
}