मेरे पास यही मुद्दा था और मुझे इसे पूरा करना था। मैंने इन समाधानों की कोशिश की, लेकिन प्रदर्शन के अंत में, कम से कम स्क्रॉलिंग के लिए बिल्कुल भी सुधार नहीं हुआ। तो यहाँ पर जो वर्कआॅर्ड मैंने किया था और जो मेरे लिए काम करता था उसकी व्याख्या।
यदि आपको "MiWebView" क्लास बनाकर, ड्रैग ईवेंट्स का पता लगाने का मौका मिला, तो "onTouchEvent" मेथड को ओवरराइट करके और कम से कम हर ड्रैग इवेंट के समय को प्रिंट करके, आप देखेंगे कि वे अलग हो गए हैं समय के लिए (नीचे) 9ms दूर। घटनाओं के बीच वह बहुत कम समय है।
WebView Source Code पर एक नज़र डालें , और केवल onTouchEvent फ़ंक्शन देखें। प्रोसेसर को 9ms से कम में संभालना असंभव है (सपने देखना जारी रखें !!!)। इसलिए आप लगातार "मिस अ ड्रैग को देखते हैं क्योंकि हम वेबकोर के टच डाउन के जवाब का इंतजार कर रहे हैं।" संदेश। कोड को समय पर नियंत्रित नहीं किया जा सकता है।
इसे कैसे जोड़ेंगे? सबसे पहले, आप इसे सुधारने के लिए onTouchEvent कोड को फिर से नहीं लिख सकते हैं, यह बहुत अधिक है। लेकिन, आप आंदोलनों को खींचने के लिए घटना की दर को सीमित करने के लिए इसे "नकली" कर सकते हैं, जो कि 40ms या 50ms को कहते हैं। (यह प्रोसेसर पर निर्भर करता है)।
सभी स्पर्श इवेंट इस तरह से चलते हैं: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_MOVE। इसलिए हमें DOWN और UP आंदोलनों को बनाए रखने और MOVE दर (ये बुरे लोग हैं) को फ़िल्टर करने की आवश्यकता है।
और यहाँ ऐसा करने का एक तरीका है (आप 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 का उपयोग करते समय स्क्रीन को छूने के कारण सभी अंतराल मामलों के लिए पूरी तरह से लागू नहीं किया गया है। हालांकि यह सबसे अच्छा समाधान है जो मैंने पाया है, कम से कम मेरी विशिष्ट आवश्यकताओं के लिए।