Estaba teniendo este mismo problema y tuve que resolverlo. Probé estas soluciones, pero al final el rendimiento, al menos para el desplazamiento, no mejoró en absoluto. Así que aquí el trabajo que realicé y la explicación de por qué funcionó para mí.
Si tuvo la oportunidad de explorar los eventos de arrastre, solo un poco, creando una clase "MiWebView", sobrescribiendo el método "onTouchEvent" y al menos imprimió la hora en que ocurre cada evento de arrastre, verá que están separados a tiempo para (hasta) 9ms de distancia. Ese es un tiempo muy corto entre eventos.
Eche un vistazo al código fuente de WebView y solo vea la función onTouchEvent. Es simplemente imposible que el procesador lo maneje en menos de 9 ms (¡Sigue soñando!). Es por eso que constantemente se ve el mensaje "Perder un arrastre mientras esperamos la respuesta de WebCore para el aterrizaje". mensaje. El código simplemente no se puede manejar a tiempo.
¿Como arreglarlo? Primero, no puede volver a escribir el código onTouchEvent para mejorarlo, es demasiado. Pero, puede "burlarse de él" para limitar la tasa de eventos para arrastrar movimientos, digamos a 40 ms o 50 ms. (Esto depende del procesador).
Todos los eventos táctiles son así: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Por lo tanto, debemos mantener los movimientos ABAJO y ARRIBA y filtrar la tasa de MOVIMIENTO (estos son los malos).
Y aquí hay una forma de hacerlo (puede agregar más tipos de eventos, como tocar dos dedos, todo lo que me interesa aquí es el desplazamiento con un solo dedo).
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;
}
}
Por supuesto, use esta clase en lugar de WebView y verá la diferencia al desplazarse.
Este es solo un enfoque para una solución, pero aún no está completamente implementado para todos los casos de retraso debido al toque de la pantalla cuando se usa WebView. Sin embargo, es la mejor solución que encontré, al menos para mis necesidades específicas.