ฉันมีปัญหาเดียวกันนี้และต้องทำงานให้เสร็จ ฉันลองใช้วิธีแก้ไขปัญหาเหล่านี้ แต่ท้ายที่สุดแล้วประสิทธิภาพการทำงานอย่างน้อยสำหรับการเลื่อนก็ไม่ได้ปรับปรุงเลย ดังนั้นนี่คือการแก้ปัญหาที่ฉันได้แสดงและคำอธิบายว่าทำไมมันถึงได้ผลสำหรับฉัน
หากคุณมีโอกาสสำรวจเหตุการณ์ลากเพียงเล็กน้อยโดยสร้างคลาส "MiWebView" เขียนทับวิธี "onTouchEvent" และอย่างน้อยพิมพ์เวลาที่เหตุการณ์ลากเกิดขึ้นทุกครั้งคุณจะเห็นว่าพวกมันถูกแยกออก ในเวลาสำหรับ (ลงไป) 9ms ออกไป นั่นเป็นเวลาสั้น ๆ ในระหว่างเหตุการณ์
ดูที่รหัสแหล่งที่มาของ WebViewและดูฟังก์ชั่น onTouchEvent มันเป็นไปไม่ได้เลยที่โปรเซสเซอร์จะจัดการในเวลาน้อยกว่า 9ms (ฝันต่อไป !!! นั่นเป็นเหตุผลที่คุณเห็น "พลาดการลากในขณะที่เรากำลังรอการตอบสนองของ WebCore สำหรับการสัมผัสลง" ข่าวสาร รหัสไม่สามารถจัดการได้ทันเวลา
จะแก้ไขได้อย่างไร? ก่อนอื่นคุณไม่สามารถเขียนรหัส onTouchEvent ซ้ำเพื่อปรับปรุงได้มันมากเกินไป แต่คุณสามารถ "เยาะเย้ยมัน" เพื่อ จำกัด อัตราเหตุการณ์สำหรับการลากการเคลื่อนไหวสมมติว่า 40ms หรือ 50ms (ขึ้นอยู่กับโปรเซสเซอร์)
กิจกรรมการสัมผัสทั้งหมดเป็นดังนี้: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP ดังนั้นเราจำเป็นต้องให้การเคลื่อนไหวขึ้นและลงและกรองอัตราการย้าย (เหล่านี้คือคนเลว)
และนี่คือวิธีที่จะทำ (คุณสามารถเพิ่มประเภทเหตุการณ์เช่นการสัมผัส 2 นิ้วทั้งหมดที่ฉันสนใจคือการเลื่อนนิ้วเดียว)
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 อย่างไรก็ตามมันเป็นทางออกที่ดีที่สุดที่ฉันพบอย่างน้อยก็สำหรับความต้องการเฉพาะของฉัน