I reworked the solution and finally found a very simple way to implement it in the same way as it was done on GMail: the HorizontalScrollView will scroll until it reaches one of its edges. Then, the next time you scroll, the whole page scrolls.
All that is required is an override of the HorizontalScrollView to check the direction of the scroll along the edges, and also make sure that the content can actually scroll.
@Override public boolean onTouchEvent(MotionEvent ev) { if (no_scrolling) return false; // Standard behavior // return super.onTouchEvent(ev); } boolean no_scrolling = false; float old_x, old_y; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getActionMasked(); Log.d(at_data.TAG, "HSV scroll intercept: " + String.format("0x%08x", action)); if (action == MotionEvent.ACTION_DOWN) { old_x = ev.getX(); old_y = ev.getY(); no_scrolling = false; } else if (action == MotionEvent.ACTION_MOVE) { float dx = ev.getX() - old_x; float dy = ev.getY() - old_y; if (Math.abs(dx) > Math.abs(dy) && dx != 0) { View hsvChild = getChildAt(0); int childW = hsvChild.getWidth(); int W = getWidth(); Log.d(at_data.TAG, "HSV " + childW + " > " + W + " ? dx = " + dx + " dy = " + dy); if (childW > W) { int scrollx = getScrollX(); if ( (dx < 0 && scrollx + W >= childW) || (dx > 0 && scrollx <= 0)) { Log.d(at_data.TAG, "HSV Wider: on edge already"); no_scrolling = true; return false; } else { Log.d(at_data.TAG, "HSV Wider: can scroll"); no_scrolling = false; } } else { Log.d(at_data.TAG, "HSV cannot scroll in desired direction"); no_scrolling = true; } } } // Standard behavior // return super.onInterceptTouchEvent(ev); }
source share