我想在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
}