Tôi đã có 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 hiệu suất, ít nhất là cho việc cuộn không cải thiện chút nào. Vì vậy, đây là cách giải quyết mà tôi đã thực hiện và giải thích lý do tại sao nó làm việc cho tôi.
Nếu bạn có cơ hội khám phá các sự kiện kéo, chỉ 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 chúng được tách ra trong thời gian cho (xuống) 9ms đi. Đó là một 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ỉ thấy chức năng onTouchEvent. Nó chỉ là không thể để nó được xử lý bởi bộ xử lý trong vòng chưa đầy 9ms (Hãy cứ mơ đi !!!). Đó là lý do tại sao bạn liên tục thấy "Bỏ lỡ một lực cản khi chúng tôi đang chờ phản hồi của WebCore để liên lạc." thông điệp. Mã không thể được xử lý đúng thời gian.
Làm thế nào để khắc phục 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. Nhưng, bạn có thể "chế nhạo nó" để giới hạn tốc độ sự kiện cho các chuyển động kéo, hãy nói 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 chạm đều 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ệ MOVE (đâ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 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, nhưng vẫn chưa được thực hiện đầy đủ cho tất cả các trường hợp độ trễ do chạm màn hình khi sử dụng WebView. Tuy nhiên đó là giải pháp tốt nhất tôi tìm thấy, ít nhất là cho nhu cầu cụ thể của tôi.