mam przerobione rozwiązanie iw końcu znalazłem bardzo prosty sposób, aby wdrożyć go w ten sam sposób to zostało zrobione na GMail: im HorizontalScrollView będą przewijać aż osiągnie jedną jego krawędzi. Następnie przy następnym przewijaniu przewija się cała strona.
Wymagało tylko przesłonięcia HorizontalScrollView w celu sprawdzenia kierunku przewijania względem krawędzi, a także upewnienia się, że zawartość może faktycznie przewijać.
@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);
}
Obejrzyj odpowiedź [this] (http://stackoverflow.com/questions/7774642/scroll-webview-horizontally-inside-a-viewpager). Ale zamiast niestandardowego WebView w tej odpowiedzi, może być konieczne rozszerzenie HorizontalScrollingView. – grine4ka