Versione corta
Come posso rilevare se Android WebView ha consumato un evento tattile? onTouchEvent
restituisce sempre true e WebViewClient
's onUnhandledInputEvent
non viene mai attivato.Verificare se Android WebView sta consumando eventi touch
un particolare
ho più WebViews all'interno di un TwoDScrollView. Come suggerisce il nome, il TwoDScrollView può essere fatto scorrere sia verticalmente che orizzontalmente. I contenuti di TwoDScrollView possono essere ingranditi/rimpiccioliti. Quando l'utente trascina il dito o usa pinch-to-zoom, voglio inviare l'evento touch per:
- WebView se il suo contenuto è scorrevole/stradale (cioè solo l'interno del WebView scorrerà/zoom)
- TwoDScrollView se la condizione di cui sopra è falsa (tutti i contenuti del TwoDScrollView scorrerà/zoom)
ho parzialmente raggiunto questo in base alle canScrollHorizontally
e canScrollVertically
metodi. Ma questi metodi funzionano solo per "scrolling nativo". Tuttavia, in alcuni casi, alcuni JavaScript all'interno di WebView consumano l'evento touch, ad esempio Google Maps. In questo caso, i metodi restituiscono false. C'è un modo per scoprire se i contenuti di WebView consumano gli eventi touch, cioè è scorrevole/zoomabile? Non riesco a modificare il contenuto di WebView, quindi la mia domanda è diversa da this one.
Ho considerato il controllo dei gestori di tocco eseguendo alcuni JavaScript nella Webview tramite il metodo evaluateJavaScript
, ma in base a this answer non esiste un modo semplice per raggiungere questo obiettivo e anche la pagina può avere altri iframe nidificati. Qualsiasi aiuto sarà apprezzato.
Quello che ho già provato
- ho overrode WebView di
onTouchEvent
e leggeresuper.onTouchEvent()
che restituisce sempre vero, non importa quale. canScrollHorizontally
ecanScrollVertically
solo in parte risolvere questo problema, come detto sopraonScrollChanged
non è utile néWebViewClient.onUnhandledInputEvent
non è mai attivato- ho considerato utilizzando JavaScript tramite
evaluateJavaScript
, ma è una soluzione molto complicata e brutta - Ho provato a rintracciare MotionEvent tramite
Debug.startMethodTracing
. Ho scoperto che si propaga come segue: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
- Secondo ContentViewCore's source code l'evento di tocco finisce in un metodo nativo
nativeOnTouchEvent
e io don So cosa accadrà di più.Ad ogni modo,onTouchEvent
restituisce sempre true e anche se è stato possibile scoprire da qualche parte se l'evento è stato consumato o meno, richiederebbe l'utilizzo di metodi privati che è anche abbastanza brutto.
Nota
Non ho bisogno di sapere come intercettare eventi di tocco inviati a WebView, ma se il WebView li sta consumando, cioè li sta usando per fare qualsiasi cosa, come ad esempio lo scorrimento, trascinando ecc
Hai provato a guardare questo link http://stackoverflow.com/questions/12578895/how-to-detect-a-swipe-gesture-on-webview. – Smashing
attendi che non sono chiaro. hai provato a chiamare semplicemente webview.setOnTouchListener? – dabluck
@Smashing: so come intercettare gli eventi di tocco su WebView, ma ho bisogno di sapere se WebView li ha consumati. Ad esempio, se l'utente sta trascinando il dito e alcuni contenuti in WebView lo stanno utilizzando (ad esempio, la mappa sta scorrendo), ho bisogno di ottenere "true". In caso contrario, se nulla nella WebView utilizza il tocco (nessun contenuto scorrevole ecc.), Ho bisogno di ottenere "false" in modo che io possa utilizzare l'evento di tocco per mio uso personale. –