 <p>So, my solution is:</p> <ol> <li>Intercept the onTouch event and calculate whether the page should change to the next or keep on the current</li> <li>Inherit from HorizontalScrollView and override the method computeScroll</li> </ol> <p>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.</p> <p>The code for the event handler is:</p> <pre><code>_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 &gt; 0.5; float edgePosition = 0; if(isBehindHalfScreen) { edgePosition = (int)(currentPage+1)*pageLengthInPx; } else { edgePosition = (int)currentPage*pageLengthInPx; } _scrollView.scrollTo((int)edgePosition, 0); } return false; } }); </code></pre> <p>And in my inherited HorizontalScrollView</p> <pre><code>@Override public void computeScroll (){ return; } </code></pre>