【发布时间】:2015-07-01 12:39:49
【问题描述】:
TL;DR
如何检测 Android WebView 是否使用了触摸事件? onTouchEvent 始终返回 true,并且永远不会触发 WebViewClient 的 onUnhandledInputEvent。
详细说明
我在 TwoDScrollView 中有多个 WebView。顾名思义,TwoDScrollView 可以垂直和水平滚动。 TwoDScrollView 的内容可以放大/缩小。当用户拖动手指或使用捏合缩放时,我想将触摸事件发送到:
- WebView 如果其内容是可滚动/可缩放的(即只有 WebView 内部会滚动/缩放)
- TwoDScrollView 如果上述条件为假(TwoDScrollView 的所有内容都会滚动/缩放)
我已经通过使用canScrollHorizontally 和canScrollVertically 方法部分实现了这一点。但这些方法仅适用于“本机滚动”。但是,在某些情况下,WebView 中的某些 JavaScript 会使用触摸事件,例如 Google Maps。在这种情况下,这些方法返回 false。有没有办法找出 WebView 的内容是否消耗触摸事件,即是否可滚动/可缩放?我无法更改 WebView 的内容,因此我的问题与 this one 不同。
我考虑过通过evaluateJavaScript 方法在Webview 中执行一些JavaScript 来检查触摸处理程序,但是根据this answer 没有简单的方法来实现这一点,而且页面可以有一些其他嵌套的iframe。任何帮助将不胜感激。
我已经尝试过的
- 我覆盖了 WebView 的
onTouchEvent并读取了super.onTouchEvent(),无论如何它总是返回 true。 -
canScrollHorizontally和canScrollVertically只是部分解决了这个问题,如上所述 -
onScrollChanged也没用 -
WebViewClient.onUnhandledInputEvent永远不会被触发 - 我曾考虑通过
evaluateJavaScript使用JavaScript,但这是一个非常复杂且丑陋的解决方案 - 我试图通过
Debug.startMethodTracing跟踪 MotionEvent。我发现它的传播方式如下:android.webkit.WebView.onTouchEventcom.android.webview.chromium.WebViewChromium.onTouchEventcom.android.org.chromium.android_webview.AwContents.onTouchEventcom.android.org.chromium.android_webview.AwContents$AwViewMethodsImpl.onTouchEventcom.android.org.chromium.content.browser.ContentViewCore.onTouchEventImpl- 根据ContentViewCore's source code,触摸事件以原生方法
nativeOnTouchEvent结束,我不知道接下来会发生什么。无论如何,onTouchEvent总是返回 true,即使可以在某个地方找出事件是否被消费,也需要使用私有方法,这也很丑陋。
注意
我不需要知道如何拦截发送到 WebView 的触摸事件,但 WebView 是否正在使用它们,即是否正在使用它们来做任何事情,例如滚动、拖动等。
【问题讨论】:
-
您是否尝试查看此链接stackoverflow.com/questions/12578895/…。
-
等等我不清楚。你试过只打电话 webview.setOnTouchListener 吗?
-
@Smashing:我知道如何拦截触摸事件到WebView,但我需要知道WebView是否消耗了它们。例如,如果用户正在拖动手指并且 WebView 中的某些内容正在使用它(例如地图正在滚动),我需要获取“true”。否则,如果 WebView 中没有任何内容使用触摸(没有可滚动内容等),我需要获取“false”,以便我可以将触摸事件用于我自己的用途。
-
@dabluck setOnTouchListener 允许我将触摸事件发送到 WebView,但没有告诉我 WebView 是否消耗了这些事件。
-
铬问题跟踪器上有一个类似的问题:code.google.com/p/chromium/issues/detail?id=515799