Per un po 'ho cercato soluzioni da qui, ma quello che ha funzionato meglio ancora avuto un problema: E' mangiato tutti gli eventi, nessuno stavano facendo attraverso ad elementi all'interno lo scroller.
Così ho ... ancora un'altra risposta, in Github e ben commentato, almeno si spera: https://github.com/Wilm0r/giggity/blob/master/app/src/main/java/net/gaast/giggity/NestedScroller.java
Come tutte le soluzioni, è un HorizontalScrollview annidato (esterno) + ScrollView (interno), con il gli eventi tattili di ricezione esterni da Android e quelli interni che li ricevono solo internamente dalla vista esterna.
Tuttavia, mi sto affidando alle ScrollView per decidere se un evento di tocco è interessante e fino a quando non lo accettano, non fare nulla che tocchi (ad esempio toccare per aprire i collegamenti/etc) può ancora farlo agli elementi figlio.
(Anche la vista supporta il pizzico per lo zoom di cui avevo bisogno.)
Nella scroller esterno:
@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 qui è la "InnerScroller", una sottoclasse di ScrollView, con alcune modifiche alla gestione degli eventi: Ho fatto alcune cose terribili per assicurare direttamente eventi di tocco in arrivo da Android vengono scartati, e invece sarà solo portarli dalla classe esterna - e solo allora passare quelli al superclasse:
@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);
}
posso dire per certo che uno ScrollView e HorizontalScrollView possono essere nidificate come ho fatto, ma l'esperienza dell'utente è scarsa in quanto può essere diversa culto per farlo scorrere nella direzione in cui lo si desidera, e non vi è alcuna interpretazione diagonale - si ottiene tutto il movimento verticale o tutto orizzontale. – Blumer
"visualizzare WebView sullo schermo." Purtroppo non ho modo di farlo :( –
@Blumer ho notato.Questo è accettabile per me ma non ottimale –