Краткая версия
Как я могу определить, использовал ли Android WebView событие касания? onTouchEvent
всегда возвращает true и WebViewClient
onUnhandledInputEvent
никогда не запускается.
Подробная версия
У меня есть несколько WebView внутри TwoDScrollView. Как следует из названия, TwoDScrollView можно прокручивать как по вертикали, так и по горизонтали. Содержимое TwoDScrollView можно увеличить или уменьшить. Когда пользователь перетаскивает свой палец или использует щепотку для увеличения, я хочу отправить событие касания на:
- WebView, если его содержимое прокручивается/масштабируется (т.е. только внутренняя часть WebView будет прокручивать/увеличивать)
- TwoDScrollView, если указанное условие является ложным (все содержимое TwoDScrollView будет прокручиваться/масштабироваться)
Я частично добился этого, используя методы canScrollHorizontally
и canScrollVertically
. Но эти методы работают только для "родной прокрутки". Однако в некоторых случаях некоторый JavaScript внутри WebView потребляет сенсорное событие, например Google Maps. В этом случае методы возвращают false. Есть ли способ узнать, потребляет ли содержимое WebView события касания, то есть прокручивается/масштабируется? Я не могу изменить содержимое WebView, поэтому мой вопрос отличается от этого.
Я рассмотрел проверку обработчиков касаний, выполнив некоторый JavaScript внутри Webview с помощью метода evaluateJavaScript
, но в соответствии с этим ответом нет простого способа достичь этого а также страница может иметь некоторые другие вложенные фреймы. Любая помощь будет оценена.
Что я уже пробовал
- Я перепробовал WebView
onTouchEvent
и читалsuper.onTouchEvent()
, который всегда возвращает true, независимо от того, что. -
canScrollHorizontally
иcanScrollVertically
только частично решают эту проблему, как указано выше. -
onScrollChanged
не полезен -
WebViewClient.onUnhandledInputEvent
никогда не запускается - Я рассмотрел использование JavaScript через
evaluateJavaScript
, но это очень сложное и уродливое решение - Я попытался проследить MotionEvent на
Debug.startMethodTracing
. Я узнал, что он распространяется следующим образом:-
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 событие touch заканчивается в нативном методе
nativeOnTouchEvent
, и я не знаю, что с ним происходит дальше, Во всяком случае,onTouchEvent
всегда возвращает true, и даже если бы можно было узнать где-то, было ли это событие поглощено или нет, для этого потребуется использование частных методов, которые также довольно уродливы.
-
Примечание
Мне не нужно знать, как перехватывать события касания, отправляемые в WebView, но использует ли их WebView, т.е. использует их для чего-либо, например, прокрутки, перетаскивания и т.д.