我曾经遇到了同样的问题,我不得不解决它。我尝试了这些解决方案,但最终表现,至少对于滚动来说,没有任何改善。所以这里是我执行的解决方法以及为什么它对我有用的解释。
如果您有机会探索拖动事件,只需要创建一个“MiWebView”类,覆盖“onTouchEvent”方法并至少打印每个拖动事件发生的时间,您将看到它们的时间间隔为(向下)9毫秒。这是事件之间非常短的时间。
查看
WebView源代码,只需查看onTouchEvent函数即可。处理器不可能在不到9ms的时间内处理它(继续做梦!!!)。这就是为什么您会不断看到“错过了拖动,因为我们正在等待WebCore响应触摸下降。”消息。代码无法按时处理。
如何修复它?首先,您不能重新编写onTouchEvent代码以改进它,因为它实在太多了。但是,您可以“模仿它”,以限制拖动运动的事件速率,比如说40ms或50ms。(这取决于处理器)。
所有触摸事件都是这样的:ACTION_DOWN-> ACTION_MOVE ...... ACTION_MOVE-> ACTION_UP。因此,我们需要保留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);
}
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时屏幕触摸会出现卡顿的情况,因此它并没有完全实现所有的滞后情况。然而,至少对于我的特定需求来说,这是我找到的最佳解决方案。