Durante un tiempo he estado tratando de soluciones de aquí, pero el que funcionó mejor todavía tenía un problema: Se comió todo caso, ninguno fue lo que a través de los elementos dentro de el scroller
Así que tengo ... otra respuesta, en Github y bien comentado, al menos, con suerte: https://github.com/Wilm0r/giggity/blob/master/app/src/main/java/net/gaast/giggity/NestedScroller.java
Como todas las soluciones, es un HorizontalScrollview anidada (exterior) + ScrollView (interior), con el eventos de recepción externa de Android, y el interior solo los recibe internamente desde la vista exterior.
Sin embargo, estoy confiando en ScrollViews para decidir si un evento táctil es interesante y hasta que lo acepten, no hacer nada, por lo que los toques (es decir, tocar para abrir enlaces/etc) aún pueden llegar a elementos secundarios.
(También la vista admite pellizcar para hacer zoom que necesitaba.)
En el desplazador exterior:
@Override
public boolean onInterceptTouchEvent(MotionEvent event)
{
if (super.onInterceptTouchEvent(event) || vscroll.onInterceptTouchEventInt(event)) {
onTouchEvent(event);
return true;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
super.onTouchEvent(event);
/* Beware: One ugliness of passing on events like this is that normally a ScrollView will
do transformation of the event coordinates which we're not doing here, mostly because
things work well enough without doing that.
For events that we pass through to the child view, transformation *will* happen (because
we're completely ignoring those and let the (H)ScrollView do the transformation for us).
*/
vscroll.onTouchEventInt(event);
return true;
}
VScroll aquí es el "InnerScroller", una subclase de ScrollView, con algunos cambios en el manejo de eventos: He hecho algunas cosas terribles para asegurar eventos de toque directamente entrantes desde Android se descartan, y en su lugar sólo les llevará desde la clase externa - y sólo entonces pasan los de la superclase:
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
/* All touch events should come in via the outer horizontal scroller (using the Int
functions below). If Android tries to send them here directly, reject. */
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
/* It will still try to send them anyway if it can't find any interested child elements.
Reject it harder (but pretend that we took it). */
return true;
}
public boolean onInterceptTouchEventInt(MotionEvent event) {
return super.onInterceptTouchEvent(event);
}
public boolean onTouchEventInt(MotionEvent event) {
super.onTouchEvent(event);
}
lo que puedo decir con certeza que un ScrollView y HorizontalScrollView se pueden anidar como he hecho, pero la experiencia del usuario es pobre, ya que puede ser difícil culto para hacer que se desplace en la dirección que desee, y no hay interpretación diagonal, ya sea que obtenga todos los movimientos verticales u horizontales. – Blumer
"tenga su WebView en forma en la pantalla". Lamentablemente no tengo forma de hacer eso :( –
@Blumer Me di cuenta. Eso es aceptable para mí, pero no es óptimo. –