J'avais ce même problème et je devais le résoudre. J'ai essayé ces solutions, mais à la fin les performances, du moins pour le défilement ne se sont pas améliorées du tout. Voici donc le workaroud que j'ai effectué et l'explication de pourquoi cela a fonctionné pour moi.
Si vous avez eu la chance d'explorer un peu les événements de glissement, juste un peu, en créant une classe "MiWebView", en écrasant la méthode "onTouchEvent" et en imprimant au moins l'heure à laquelle chaque événement de glissement se produit, vous verrez qu'ils sont séparés à temps pour (jusqu'à) 9 ms. C'est un temps très court entre les événements.
Jetez un œil au code source WebView , et voyez simplement la fonction onTouchEvent. Il est tout simplement impossible qu'elle soit gérée par le processeur en moins de 9ms (Continuez à rêver !!!). C'est pourquoi vous voyez constamment le message "Manquez une traînée car nous attendons la réponse de WebCore pour l'atterrissage." message. Le code ne peut tout simplement pas être traité à temps.
Comment le réparer? Tout d'abord, vous ne pouvez pas réécrire le code onTouchEvent pour l'améliorer, c'est tout simplement trop. Mais, vous pouvez "vous moquer" afin de limiter le taux d'événements pour les mouvements de glissement, disons à 40 ms ou 50 ms. (cela dépend du processeur).
Tous les événements tactiles se présentent comme suit: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Nous devons donc garder les mouvements DOWN et UP et filtrer le taux de MOVE (ce sont les méchants).
Et voici un moyen de le faire (vous pouvez ajouter plus de types d'événements comme le toucher à 2 doigts, tout ce qui m'intéresse ici est le défilement à un seul doigt).
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;
}
}
Bien sûr, utilisez cette classe au lieu de WebView et vous verrez la différence lors du défilement.
Il ne s'agit que d'une approche à une solution, mais qui n'est pas encore entièrement mise en œuvre pour tous les cas de retard en raison du toucher de l'écran lors de l'utilisation de WebView. Cependant, c'est la meilleure solution que j'ai trouvée, au moins pour mes besoins spécifiques.