Verifique se o Android WebView está consumindo eventos de toque
Como posso detectar se o Android WebView consumiu um evento de toque?onTouchEvent
sempre retorna verdadeiro eWebViewClient
éonUnhandledInputEvent
nunca é acionado.
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.
onTouchEvent
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.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
De 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.NotaNã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.