简述
如何检测Android WebView是否消耗了触摸事件?onTouchEvent
总是返回true,而WebViewClient
的onUnhandledInputEvent
从未被触发。
详细描述
我有多个WebViews在TwoDScrollView中。正如其名称所示,TwoDScrollView可以同时垂直和水平滚动。TwoDScrollView的内容可以缩放。当用户拖动手指或使用捏合手势缩放时,我希望将触摸事件分派到:
- 如果其内容可滚动/可缩放,则将其分派到WebView(即仅WebView内部将滚动/缩放)
- 如果上述条件不成立(TwoDScrollView的所有内容都将滚动/缩放),则将其分派到TwoDScrollView。
我通过使用canScrollHorizontally
和canScrollVertically
方法部分实现了此目标。但是这些方法仅适用于“本机滚动”。但是,在某些情况下,WebView内部的一些JavaScript会消耗触摸事件,例如Google地图。在这种情况下,该方法返回false。有没有办法找出WebView的内容是否消耗了触摸事件,即是否可滚动/缩放?我无法更改WebView的内容,因此我的问题与此问题不同。
我考虑通过使用evaluateJavaScript
方法在Webview内执行一些JavaScript来检查触摸处理程序,但是根据这个答案,没有简单的方法可以实现这一点,而且页面可能有一些其他嵌套的iframes。非常感谢您提供任何帮助。
我已经尝试过的
- 我重写了WebView的
onTouchEvent
并阅读了super.onTouchEvent()
,但它总是返回true。
canScrollHorizontally
和canScrollVertically
只能部分解决这个问题,正如上面提到的那样。onScrollChanged
也没有用。WebViewClient.onUnhandledInputEvent
从来没有触发过。evaluateJavaScript
通过JavaScript实现,但这是一种非常复杂且丑陋的解决方案。Debug.startMethodTracing
跟踪MotionEvent。我发现它是这样传播的:
android.webkit.WebView.onTouchEvent
com.android.webview.chromium.WebViewChromium.onTouchEvent
com.android.org.chromium.android_webview.AwContents.onTouchEvent
com.android.org.chromium.android_webview.AwContents$AwViewMethodsImpl.onTouchEvent
com.android.org.chromium.content.browser.ContentViewCore.onTouchEventImpl
- 根据ContentViewCore源代码,触摸事件最终进入一个本地方法
nativeOnTouchEvent
,我不知道它后面会发生什么。无论如何,onTouchEvent
始终返回true,即使可以找到某个地方确定事件是否被消耗,也需要使用私有方法,这也相当丑陋。
注意事项
我不需要知道如何拦截发送给WebView的触摸事件,而是需要知道WebView是否正在消耗它们,即是否将其用于滚动、拖动等操作。