he vuelto a trabajar una solución y finalmente encontré una manera muy simple de implementar la misma manera que se ha hecho en Gmail: la HorizontalScrollView se desplazará hasta que llega a una de sus bordes. Luego, en el siguiente desplazamiento, se desplazará toda la página.
Todo lo que se requería era anular HorizontalScrollView para verificar la dirección de desplazamiento en comparación con los bordes y también asegurarse de que el contenido se puede desplazar.
@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);
}
reloj [esto] (http://stackoverflow.com/questions/7774642/scroll-webview-horizontally-inside-a-viewpager) respuesta. Pero en lugar de WebView personalizado en esa respuesta, es posible que necesite extender su HorizontalScrollingView. – grine4ka