Javascript 如何捕捉android webview中元素的滚动

Javascript 如何捕捉android webview中元素的滚动,javascript,android,webview,swiperefreshlayout,Javascript,Android,Webview,Swiperefreshlayout,我有一个SwipeRefreshLayout视图作为父视图。在它里面,我使用一个web视图来加载网页。我想通过下拉布局来重新加载webview。以下是我的xml: 和java代码: mWebView=(WebView)view.findViewById(R.id.WebView); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.loadUrl(“http://kashirskoe.vegas-city.ru/rente

我有一个SwipeRefreshLayout视图作为父视图。在它里面,我使用一个web视图来加载网页。我想通过下拉布局来重新加载webview。以下是我的xml:


和java代码:

mWebView=(WebView)view.findViewById(R.id.WebView);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl(“http://kashirskoe.vegas-city.ru/renter/");
mSwipeRefreshLayout=(SwipeRefreshLayout)view.findViewById(R.id.refresh\u布局);
mSwipeRefreshLayout.setOnRefreshListener(新的SwipeRefreshLayout.OnRefreshListener()){
@凌驾
公共void onRefresh(){
mSwipeRefreshLayout.setRefreshing(true);
mSwipeRefreshLayout.postDelayed(新的Runnable(){
@凌驾
公开募捐{
mWebView.reload();
mSwipeRefreshLayout.setRefresh(false);
}
}, 1000);
}
});
乍一看,它效果很好。但是当用户向下滚动时,例如网页上的地图控件,它不会滚动。代替此SwipeRefreshLayout截取滚动并刷新网页(示例页面url位于代码中)

我想在页面上的任何web控件滚动时禁用SwipeRefreshLayout滚动。就像谷歌浏览器Chrome一样

我认为我需要在webview中注入并执行JavaScript,以便检测页面上任何滚动控件上的滚动事件。并将其传递给android本机代码。我知道如何将其传递给本机代码


但是如何在javascript中检测此滚动事件?

您可以通过定义扩展WebView的自定义WebView类并重写方法
onOverScrolled
来检测WebView的内容是否在滚动 首先禁用SwipeRefreshLayout,并在WebView中的内容未滚动时启用它。然后,您可以通过捕捉WebView上发生的触碰事件来检测滚动手势开始

public class MyWebView extends WebView{
    @Override
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);

        if( clampedX || clampedY ){
            //Content is not scrolling
            //Enable SwipeRefreshLayout
            ViewParent parent = this.getParent();
            if ( parent instanceof SwipeRefreshLayout) {
                ((SwipeRefreshLayout)parent).setEnabled(true);
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        if(event.getActionMasked()==MotionEvent.ACTION_DOWN){
            //Disable SwipeRefreshLayout
            ViewParent parent = this.getParent();
            if ( parent instanceof SwipeRefreshLayout) {
                ((SwipeRefreshLayout)parent).setEnabled(false);
            }
        }
        return true;
    }
}

webview的内容滚动非常完美。我想检测网页上任何元素的滚动,但不是所有webview的内容。例如,在页面上除其他元素外还布置了地图元素。我可以滚动它。但是当添加SwipeRefreshLayout时,map元素的滚动被截获。是的,我正在用上面的解决方案处理类似的情况。你试过了吗?根据我的经验,在您滚动地图之前,您不会收到clampedX/Y为true的onOverScrolled事件,因此如果SwiperFreshLayout被禁用,则不会受到影响。反之亦然,当您将页面滚动到边缘时,将接收到一个ONOVERSCROLED事件(clampedX/Y true),您可以启用SwiperFreshLayout来处理刷新手势情况。它不起作用。如果将事件子序列传递给webview,则父容器(SwipeRefreshLayout)无法执行刷新作业,直到webview处理最后一个pull手势事件(ACTION_UP)。这对我来说是可行的,只需在每个方法中调用
super