Eu estava tendo esse mesmo problema e tive que resolvê-lo. Tentei essas soluções, mas no final o desempenho, pelo menos para a rolagem, não melhorou nada. Então aqui está a solução alternativa que eu realizei e a explicação de por que funcionou para mim.
Se você teve a chance de explorar os eventos de arrasto, criando um pouco da classe "MiWebView", substituindo o método "onTouchEvent" e imprimindo pelo menos a hora em que cada evento de arrasto ocorre, você verá que eles estão separados a tempo de (até) 9ms de distância. Esse é um período muito curto entre os eventos.
Veja o código-fonte do WebView e veja a função onTouchEvent. É simplesmente impossível que ele seja manuseado pelo processador em menos de 9ms (continue sonhando !!!). É por isso que você vê constantemente a mensagem "Não se preocupe, pois estamos aguardando a resposta do WebCore para o toque". mensagem. O código simplesmente não pode ser tratado a tempo.
Como corrigi-lo? Primeiro, você não pode reescrever o código onTouchEvent para melhorá-lo, é demais. Mas você pode "zombar" para limitar a taxa de eventos para movimentos de arrasto, digamos 40ms ou 50ms. (isso depende do processador).
Todos os eventos de toque são assim: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Portanto, precisamos manter os movimentos DOWN e UP e filtrar a taxa de MOVE (esses são os bandidos).
E aqui está uma maneira de fazer isso (você pode adicionar mais tipos de eventos, como o toque de 2 dedos, tudo o que me interessa aqui é a rolagem com um 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;
}
}
É claro que use esta classe em vez do WebView e você verá a diferença ao rolar.
Esta é apenas uma abordagem para uma solução, mas ainda não totalmente implementada para todos os casos de atraso devido ao toque na tela ao usar o WebView. No entanto, é a melhor solução que encontrei, pelo menos para minhas necessidades específicas.