如何在android WebView中停止触摸事件,当其内容滚动时



我想在android WebView中禁用内容滚动时的触摸事件。如何做到这一点?

您可以向WebView添加滚动事件侦听器,如下所示:

webView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

}
});

(需要API 23(

然后在里面添加一个甚至触摸的监听器,它像这样返回true:

webView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});

它禁用WebView上的所有触摸事件,因为触摸侦听器在WebView的默认触摸行为之前执行。

因此,最终结果将是:

webView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
webView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});

}
});

它还将阻止您点击链接,不会进入下一页

webview.setHapticFeedbackEnabled(false);
webView.setLongClickable(false);
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(final View v, final MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
event.setLocation(webview.getWidth() + 1, webview.getHeight() + 1);
}
return event.getAction() == MotionEvent.ACTION_UP;
}
});

使用此代码禁用/启用触摸事件。。

private fun DisableScreen(status: Boolean) {
if (status) {
window?.setFlags(
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
);
} else {
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}
}

这将禁用屏幕上的触摸,您可以通过清除标志再次启用触摸。

似乎WebView无法处理CANCEL事件,并将其视为UP。我的解决方法是使用手势检测器来计算点击并发送它们,然后丢弃其他任何东西:

val gd = GestureDetector(context, object : SimpleOnGestureListener() {
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
return onTouchEvent(e.also { it.action = MotionEvent.ACTION_DOWN }) &&
onTouchEvent(e.also { it.action = MotionEvent.ACTION_UP })
}
})
setOnTouchListener { _, event ->
gd.onTouchEvent(event)
true
}

最新更新