Saya mengalami masalah yang sama dan saya harus mengatasinya. Saya mencoba solusi ini, tetapi pada akhirnya kinerjanya, setidaknya untuk scrolling tidak membaik sama sekali. Jadi, inilah workaroud yang saya lakukan dan penjelasan mengapa itu berhasil bagi saya.
Jika Anda memiliki kesempatan untuk menjelajahi acara seret, hanya sedikit, dengan membuat kelas "MiWebView", menimpa metode "onTouchEvent" dan setidaknya mencetak waktu di mana setiap peristiwa seret terjadi, Anda akan melihat bahwa mereka dipisahkan dalam waktu untuk (turun ke) 9ms jauhnya. Itu adalah waktu yang sangat singkat di antara berbagai peristiwa.
Lihatlah Kode Sumber WebView , dan lihat saja fungsi onTouchEvent. Tidak mungkin untuk ditangani oleh prosesor dalam waktu kurang dari 9ms (Teruslah bermimpi !!!). Itu sebabnya Anda terus-menerus melihat "Miss a drag saat kami menunggu respons WebCore untuk mendarat." pesan. Kode tidak bisa ditangani tepat waktu.
Bagaimana memperbaikinya? Pertama, Anda tidak dapat menulis ulang kode onTouchEvent untuk memperbaikinya, terlalu banyak. Tapi, Anda bisa "mengejeknya" untuk membatasi laju acara untuk menyeret gerakan, misalnya 40ms atau 50ms. (ini tergantung pada prosesor).
Semua acara sentuh seperti ini: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Jadi kita perlu menjaga gerakan BAWAH dan ATAS dan memfilter tingkat MOVE (ini adalah orang jahat).
Dan di sini adalah cara untuk melakukannya (Anda dapat menambahkan lebih banyak jenis acara seperti sentuhan 2 jari, yang saya tertarik di sini adalah pengguliran satu jari).
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;
}
}
Tentu saja Gunakan kelas ini sebagai ganti WebView dan Anda akan melihat perbedaannya saat menggulir.
Ini hanya pendekatan untuk solusi, namun masih belum sepenuhnya diterapkan untuk semua kasus lag karena menyentuh layar saat menggunakan WebView. Namun itu adalah solusi terbaik yang saya temukan, setidaknya untuk kebutuhan spesifik saya.