Tôi đã gặp vấn đề tương tự và tôi phải giải quyết nó. Tôi đã thử các giải pháp này, nhưng cuối cùng thì hiệu suất, ít nhất là đối với việc cuộn không cải thiện chút nào. Vì vậy, đây là công việc mà tôi đã thực hiện và giải thích lý do tại sao nó hoạt động với tôi.
Nếu bạn có cơ hội khám phá các sự kiện kéo, chỉ cần một chút, bằng cách tạo Lớp "MiWebView", ghi đè phương thức "onTouchEvent" và ít nhất là in thời gian mà mọi sự kiện kéo xảy ra, bạn sẽ thấy rằng chúng được tách biệt trong thời gian (giảm xuống) 9ms. Đó là khoảng thời gian rất ngắn giữa các sự kiện.
Hãy xem Mã nguồn WebView và chỉ cần xem chức năng onTouchEvent. Nó không thể được xử lý bởi bộ vi xử lý trong vòng chưa đầy 9ms (Hãy tiếp tục mơ ước !!!). Đó là lý do tại sao bạn liên tục thấy thông báo "Bỏ lỡ một lực cản khi chúng tôi đang chờ phản hồi của WebCore để chạm xuống." thông điệp. Mã chỉ không thể được xử lý đúng hạn.
Làm thế nào để sửa chữa nó? Đầu tiên, bạn không thể viết lại mã onTouchEvent để cải thiện nó, nó chỉ là quá nhiều. Tuy nhiên, bạn có thể "mô phỏng nó" để giới hạn tỷ lệ sự kiện cho các chuyển động kéo, giả sử là 40ms hoặc 50ms. (điều này phụ thuộc vào bộ xử lý).
Tất cả các sự kiện cảm ứng sẽ diễn ra như sau: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Vì vậy, chúng ta cần phải giữ các chuyển động XUỐNG và LÊN và lọc tỷ lệ DI CHUYỂN (đây là những kẻ xấu).
Và đây là một cách để làm điều đó (bạn có thể thêm nhiều loại sự kiện hơn như chạm 2 ngón tay, tất cả những gì tôi quan tâm ở đây là cuộn một ngón tay).
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;
}
}
Tất nhiên Sử dụng lớp này thay vì WebView và bạn sẽ thấy sự khác biệt khi cuộn.
Đây chỉ là một cách tiếp cận giải pháp, vẫn chưa được thực hiện đầy đủ cho tất cả các trường hợp giật lag do chạm vào màn hình khi sử dụng WebView. Tuy nhiên đó là giải pháp tốt nhất mà tôi tìm thấy, ít nhất là cho nhu cầu cụ thể của tôi.