Avevo lo stesso problema e ho dovuto risolverlo. Ho provato queste soluzioni, ma alla fine le prestazioni, almeno per lo scrolling, non sono migliorate affatto. Quindi ecco la soluzione che ho eseguito e la spiegazione del perché ha funzionato per me.
Se hai avuto la possibilità di esplorare gli eventi di trascinamento, solo un po ', creando una classe "MiWebView", sovrascrivendo il metodo "onTouchEvent" e almeno stampando il tempo in cui si verifica ogni evento di trascinamento, vedrai che sono separati in tempo per (fino a) 9ms di distanza. Questo è un tempo molto breve tra gli eventi.
Dai un'occhiata al codice sorgente di WebView e vedi solo la funzione onTouchEvent. È impossibile che sia gestito dal processore in meno di 9ms (Continua a sognare !!!). Ecco perché vedi costantemente "Miss un trascinamento mentre stiamo aspettando la risposta di WebCore per il touchdown". Messaggio. Il codice non può essere gestito in tempo.
Come sistemarlo? Innanzitutto, non è possibile riscrivere il codice onTouchEvent per migliorarlo, è semplicemente troppo. Ma puoi "deriderlo" per limitare la frequenza degli eventi per trascinare i movimenti, diciamo a 40ms o 50ms. (questo dipende dal processore).
Tutti gli eventi touch vanno così: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Quindi dobbiamo mantenere i movimenti DOWN e UP e filtrare il MOVE rate (questi sono i cattivi).
Ed ecco un modo per farlo (puoi aggiungere altri tipi di eventi come il tocco di 2 dita, tutto ciò che mi interessa qui è lo scorrimento con un solo dito).
import android.content.Context;
import android.view.MotionEvent;
import android.webkit.WebView;
public class MyWebView extends WebView{
public MyWebView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
private long lastMoveEventTime = -1;
private int eventTimeInterval = 40;
@Override
public boolean onTouchEvent(MotionEvent ev) {
long eventTime = ev.getEventTime();
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_MOVE: {
if ((eventTime - lastMoveEventTime) > eventTimeInterval){
lastMoveEventTime = eventTime;
return super.onTouchEvent(ev);
}
break;
}
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP: {
return super.onTouchEvent(ev);
}
}
return true;
}
}
Naturalmente usa questa classe invece di WebView e vedrai la differenza durante lo scorrimento.
Questo è solo un approccio a una soluzione, ma non è ancora completamente implementato per tutti i casi di ritardo a causa del tocco dello schermo quando si utilizza WebView. Tuttavia è la migliore soluzione che ho trovato, almeno per le mie esigenze specifiche.