Verifique se o Android WebView está consumindo eventos de toque

Versão curta

Como posso detectar se o Android WebView consumiu um evento de toque?onTouchEvent sempre retorna verdadeiro eWebViewClientéonUnhandledInputEvent nunca é acionado.

Versão detalhada

Eu tenho vários WebViews dentro de um TwoDScrollView. Como o próprio nome sugere, o TwoDScrollView pode ser rolado verticalmente e horizontalmente. O conteúdo do TwoDScrollView pode ser aumentado / diminuído. Quando o usuário arrasta o dedo ou usa pinçar para ampliar, desejo despachar o evento de toque para:

WebView se seu conteúdo for rolável / com zoom (ou seja, apenas a parte interna do WebView rolará / aumentará o zoom)TwoDScrollView se a condição acima for falsa (todo o conteúdo do TwoDScrollView será rolado / aumentado)

Eu parcialmente consegui isso usando ocanScrollHorizontally ecanScrollVertically métodos. Mas esses métodos funcionam apenas para "rolagem nativa". No entanto, em alguns casos, algum JavaScript dentro do WebView consome o evento de toque, por exemplo, Google Maps. Nesse caso, os métodos retornam false. Existe alguma maneira de descobrir se o conteúdo do WebView consome os eventos de toque, ou seja, é rolável / com zoom? Não posso alterar o conteúdo do WebView; portanto, minha pergunta é diferente deeste.

Eu considerei verificar manipuladores de toque executando algum JavaScript dentro da Webview peloevaluateJavaScript método, mas de acordo comesta resposta não há uma maneira fácil de conseguir isso e também a página pode ter outros iframes aninhados. Qualquer ajuda será apreciada.

O que eu já tenteiSubstituí o WebViewonTouchEvent e leiasuper.onTouchEvent() que sempre retorna verdadeiro, não importa o quê.canScrollHorizontally ecanScrollVertically resolva apenas parcialmente esse problema, como mencionado acimaonScrollChanged também não é útilWebViewClient.onUnhandledInputEvent nunca é acionadoEu considerei usar JavaScript viaevaluateJavaScript, mas é uma solução muito complicada e feiaTentei rastrear o MotionEventDebug.startMethodTracing. Eu descobri que é propagado da seguinte forma: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.onTouchEventImplDe acordo comCódigo fonte do ContentViewCore o evento touch acaba em um método nativonativeOnTouchEvent e não sei o que mais acontece com isso. De qualquer forma,onTouchEvent sempre retorna true e, mesmo que fosse possível descobrir em algum lugar se o evento foi consumido ou não, seria necessário o uso de métodos privados, o que também é bastante feio.Nota

Não preciso saber como interceptar eventos de toque enviados ao WebView, mas se o WebView os está consumindo, ou seja, está usando-os para fazer qualquer coisa, como rolar, arrastar etc.

questionAnswers(4)

yourAnswerToTheQuestion