У мене виникло те саме питання, і мені довелося його розробити. Я спробував ці рішення, але в кінці продуктивності, принаймні, для прокрутки зовсім не покращився. Отож, тут я працюю, і я пояснюю, чому це працювало для мене.
Якщо ви мали змогу вивчити події перетягування лише трохи, створивши клас "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. Однак це найкраще рішення, яке я знайшов, принаймні для моїх конкретних потреб.