Ich hatte das gleiche Problem und musste es klären. Ich habe diese Lösungen ausprobiert, aber am Ende hat sich die Leistung, zumindest beim Scrollen, überhaupt nicht verbessert. Also hier die Arbeit, die ich gemacht habe und die Erklärung, warum es für mich funktioniert hat.
Wenn Sie die Möglichkeit hatten, die Drag-Ereignisse ein wenig zu erkunden, indem Sie eine "MiWebView" -Klasse erstellt, die "onTouchEvent" -Methode überschrieben und zumindest die Zeit gedruckt haben, in der jedes Drag-Ereignis auftritt, werden Sie feststellen, dass sie getrennt sind rechtzeitig für (bis zu) 9ms entfernt. Das ist eine sehr kurze Zeit zwischen den Ereignissen.
Schauen Sie sich den WebView-Quellcode an und sehen Sie sich nur die Funktion onTouchEvent an. Es ist einfach unmöglich, dass es vom Prozessor in weniger als 9 ms gehandhabt wird (Träumen Sie weiter !!!). Aus diesem Grund wird ständig die Meldung "Miss a Drag, während wir auf die Antwort von WebCore auf das Aufsetzen warten" angezeigt. Botschaft. Der Code kann einfach nicht rechtzeitig verarbeitet werden.
Wie man es repariert? Erstens können Sie den onTouchEvent-Code nicht neu schreiben, um ihn zu verbessern. Er ist einfach zu viel. Sie können es jedoch "verspotten", um die Ereignisrate für das Ziehen von Bewegungen auf 40 ms oder 50 ms zu begrenzen. (Dies hängt vom Prozessor ab).
Alle Berührungsereignisse sehen folgendermaßen aus: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Also müssen wir die DOWN- und UP-Bewegungen beibehalten und die MOVE-Rate filtern (das sind die Bösen).
Und hier ist eine Möglichkeit, dies zu tun (Sie können weitere Ereignistypen hinzufügen, z. B. 2 Finger berühren. Alles, was mich hier interessiert, ist das Scrollen mit einem Finger).
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;
}
}
Wenn Sie diese Klasse anstelle von WebView verwenden, werden Sie beim Scrollen den Unterschied feststellen.
Dies ist nur ein Lösungsansatz, der jedoch aufgrund von Bildschirmberührungen bei Verwendung von WebView noch nicht für alle Verzögerungsfälle vollständig implementiert ist. Es ist jedoch die beste Lösung, die ich gefunden habe, zumindest für meine spezifischen Bedürfnisse.