如何检测Android WebView是否消耗了触摸事件?onTouchEvent始终返回true和WebViewClient的onUnhandledInputEvent永远不会触发.
我在TwoDScrollView中有多个WebView.顾名思义,TwoDScrollView可以垂直和水平滚动.TwoDScrollView的内容可以放大/缩小.当用户拖动手指或使用双指缩放时,我想将触摸事件发送到:
我通过使用canScrollHorizontally和canScrollVertically方法部分实现了这一点.但这些方法仅适用于"原生滚动".但是,在某些情况下,WebView中的某些JavaScript会消耗触摸事件,例如Google Maps.在这种情况下,方法返回false.有没有办法找出WebView的内容是否消耗触摸事件,即可滚动/可缩放?我无法更改WebView的内容,因此我的问题与此不同.
我已经考虑通过evaluateJavaScript方法在Webview中执行一些JavaScript来检查触摸处理程序,但根据这个答案,没有简单的方法来实现这一点,并且页面也可以有一些其他嵌套的iframe.任何帮助将不胜感激.
onTouchEvent并读取super.onTouchEvent()哪些内容始终返回true.canScrollHorizontallycanScrollVertically如上所述,只能部分解决这个问题onScrollChanged 也没用WebViewClient.onUnhandledInputEvent 永远不会被触发evaluateJavaScript,但这是一个非常复杂和丑陋的解决方案Debug.startMethodTracing.我发现它传播如下:
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.onTouchEventImplnativeOnTouchEvent,我不知道它会发生什么.无论如何,onTouchEvent总是返回true,即使有可能在某处发现事件是否被消耗,它也需要使用非常丑陋的私有方法.我不需要知道如何拦截发送到WebView的触摸事件,但WebView是否正在使用它们,即是否正在使用它们执行任何操作,例如滚动,拖动等.
您可以通过重写来将所有touch事件传递给,这样您就可以通过监听 来了解Android WebView 何时何地正在消费触摸事件。GestureDetectoronTouchEventWebViewGestureDetector
尝试这样:
public class MyWebView extends WebView {
private Context context;
private GestureDetector gestDetector;
public MyWebView(Context context) {
super(context);
this.context = context;
gestDetector = new GestureDetector(context, gestListener);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return gd.onTouchEvent(event);
}
GestureDetector.SimpleOnGestureListener gestListener= new GestureDetector.SimpleOnGestureListener() {
public boolean onDown(MotionEvent event) {
return true;
}
public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
//if (event1.getRawX() > event2.getRawX()) {
// show_toast("swipe left");
//} else {
// show_toast("swipe right");
//}
//you can trace any touch events here
return true;
}
};
void show_toast(final String text) {
Toast t = Toast.makeText(context, text, Toast.LENGTH_SHORT);
t.show();
}
}
Run Code Online (Sandbox Code Playgroud)
我希望你能受到启发。
| 归档时间: |
|
| 查看次数: |
11403 次 |
| 最近记录: |