У меня была такая же проблема, и я должен был ее решить. Я попробовал эти решения, но в итоге производительность, по крайней мере для прокрутки, не улучшилась. Итак, вот что я сделал, и объяснение того, почему это сработало для меня.
Если у вас была возможность немного изучить события перетаскивания, создав класс «MiWebView», переписав метод «onTouchEvent» и хотя бы напечатав время, в которое происходит каждое событие перетаскивания, вы увидите, что они разделены вовремя (до) 9 мс. Это очень короткое время между событиями.
Взгляните на исходный код WebView и просто посмотрите на функцию onTouchEvent. Это просто невозможно обработать процессором менее чем за 9 мс (продолжайте мечтать !!!). Вот почему вы постоянно видите «Пропусти перетаскивание, пока мы ждем ответа WebCore для приземления». сообщение. Код просто не может быть обработан вовремя.
Как это исправить? Во-первых, вы не можете переписать код onTouchEvent, чтобы улучшить его, это слишком много. Но вы можете «насмехаться над этим», чтобы ограничить частоту событий для перетаскивания движений, скажем, до 40 или 50 мс. (это зависит от процессора).
Все события касания идут так: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Таким образом, нам нужно сохранять движения ВНИЗ и ВВЕРХ и фильтровать скорость движения (это плохие парни).
И вот способ сделать это (вы можете добавить больше типов событий, таких как касание двумя пальцами, все, что меня интересует, это прокрутка одним пальцем).
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;
}
}
Конечно, используйте этот класс вместо WebView, и вы увидите разницу при прокрутке.
Это всего лишь подход к решению, но еще не полностью реализованный для всех случаев задержки из-за касания экрана при использовании WebView. Однако это лучшее решение, которое я нашел, по крайней мере, для моих конкретных потребностей.