J'avais le même problème et je devais le résoudre. J'ai essayé ces solutions, mais à la fin les performances, au moins pour le défilement, ne se sont pas améliorées du tout. Voici donc le travail que j'ai effectué et l'explication de la raison pour laquelle cela a fonctionné pour moi.
Si vous avez eu la chance d'explorer les événements de glisser, juste un peu, en créant une classe "MiWebView", en écrasant la méthode "onTouchEvent" et en imprimant au moins le temps dans lequel chaque événement de glisser se produit, vous verrez qu'ils sont séparés dans le temps pour (jusqu'à) 9ms de distance. C'est un temps très court entre les événements.
Jetez un coup d'œil à la Code source du WebView et voir la fonction onTouchEvent. Il est tout simplement impossible qu'elle soit traitée par le processeur en moins de 9ms (Continuez à rêver ! !!). C'est pourquoi vous voyez constamment le message "Miss a drag as we are waiting for WebCore's response for touch down". 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 le "simuler" afin de limiter la fréquence des événements pour les mouvements de glisser, disons à 40 ms ou 50 ms (cela dépend du processeur).
Tous les événements de contact se passent comme ça : ACTION_DOWN -> ACTION_MOVE......ACTION_MOVE -> ACTION_UP. Nous devons donc conserver les mouvements DOWN et UP et filtrer le taux de MOVE (ce sont les mauvais élèves).
Et voici une façon de le faire (vous pouvez ajouter d'autres types d'événements comme le toucher à deux 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 à la place de WebView et vous verrez la différence lors du défilement.
Il ne s'agit que d'une approche de la solution, qui n'est pas encore totalement mise en œuvre pour tous les cas de décalage dus au toucher de l'écran lors de l'utilisation de WebView. Cependant, c'est la meilleure solution que j'ai trouvée, du moins pour mes besoins spécifiques.
3 votes
On dirait que vous avez besoin de poster du code.
1 votes
Duplication possible de Performances des WebViews Android
1 votes
@KenWhite sauf que cette question a plus de réponses, cette question a des réponses meilleures et plus complètes, cette question a deux fois plus de vues, les deux questions ont plus de deux ans, la version d'Android à laquelle ces deux questions s'appliquaient sont obsolètes... qu'est-ce que ça vous apporte exactement de signaler ça ?
0 votes
@CQM : Cette question a été signalée automatiquement par le système en raison de la réponse dupliquée de George Mays ci-dessous. Si sa réponse peut être répétée mot pour mot comme réponse à plusieurs messages, l'un d'eux est un doublon de l'autre. La question liée a été postée (et a reçu une réponse) en premier sur la base de la date du post. Un doublon est un doublon, et le premier message était l'original (et les réponses étaient également antérieures). Je n'ai rien à gagner à signaler ce problème (et je ne l'ai pas fait au départ).
1 votes
De même, n'utilisez pas l'événement click dans vos applications, il ajoute un délai de 300 ms pour répondre à chaque clic, afin de déterminer qu'il s'agit bien d'un clic. Il vaut mieux utiliser touchstart à la place. J'ai créé un clickhandler qui utilise deux événements et prend le premier événement déclenché. J'utilise 'touchstart click', de sorte que cela fonctionne également sans écran tactile.