判断webview 滑动方向,老生常谈的问题,再次提及。

监听webview是否滑动到底部、顶部,可以通过重新webviewonScrollChanged()或者onTouchEvent()判断。

其中通过重写onTouchEvent()可以判断出webview滑动方向

判断是否滑动到底部,是通过判断webview的高度与当前webview的高度做比较得出。

判断是否滑动到顶部,是通过判断webviewgetScrollY() == 0 得出。

第一种,重写onScrollChanged(),通过回调传递给外部调用的地方。

public class McWebViewScroll extends WebView {

    public McWebViewScroll(Context context) {
        super(context);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet, int i) {
        super(context, attributeSet, i);
    }


    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        // webview的高度
        float webcontent = getContentHeight() * getScale();
        // 当前webview的高度
        float webnow = getHeight() + getScrollY();

        if (Math.abs(webcontent - webnow) < 1) {
            //处于底端
            Log.e("测试","处于底端");

            if(mOnScrollChangeListener !=null){
                mOnScrollChangeListener.onPageEnd(l, t, oldl, oldt);
            }
        } else if (getScrollY() == 0) {
            //处于顶端
            Log.e("测试","处于顶端");
            if(mOnScrollChangeListener !=null){
                mOnScrollChangeListener.onPageTop(l, t, oldl, oldt);
            }
        } else {
            if(mOnScrollChangeListener !=null){
                mOnScrollChangeListener.onScrollChanged(l, t, oldl, oldt);
            }
        }
    }

    private OnScrollChangeListener mOnScrollChangeListener;

    public void setOnScrollChangeListener(OnScrollChangeListener listener) {
        this.mOnScrollChangeListener = listener;
    }

    public interface OnScrollChangeListener {

        public void onPageEnd(int l, int t, int oldl, int oldt);

        public void onPageTop(int l, int t, int oldl, int oldt);

        public void onScrollChanged(int l, int t, int oldl, int oldt);

    }



}

调用
 

        webView.setOnScrollChangeListener(object :McWebViewScroll.OnScrollChangeListener{
            override fun onPageEnd(l: Int, t: Int, oldl: Int, oldt: Int) {
                
            }

            override fun onPageTop(l: Int, t: Int, oldl: Int, oldt: Int) {
            }

            override fun onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int) {
            }

        })

第二种,重写onTouchEvent(),判断滑动方向,通过回调传递给外部调用的地方。

public class McWebViewScroll extends WebView {

    public McWebViewScroll(Context context) {
        super(context);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet, int i) {
        super(context, attributeSet, i);
    }
    

    public interface McEventListener {
        void onEventUp();
        void onEventDown();
        void onEventPageTop();
        void onEventPageEnd();
    }

    private McEventListener mEventListener;

    public void setMcEventListener(McEventListener listener) {
        mEventListener = listener;
    }

    private int lastScrollY;
    private boolean scrollFx = true;//true 向下滑 false 向上滑

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {

            case MotionEvent.ACTION_DOWN:
                lastScrollY = this.getScrollY();

            case MotionEvent.ACTION_MOVE:
                if (Math.abs(lastScrollY - this.getScrollY()) > 10) {
                    if (lastScrollY > this.getScrollY()) {//向下滑
                        scrollFx = true;
                        Log.e("测试", "向下滑");
                    } else {//向上滑
                        scrollFx = false;
                        Log.e("测试", "向上滑");
                    }

                    lastScrollY = this.getScrollY();

                    if (scrollFx) {
                        Log.e("测试", "下滑 ");
                        if (mEventListener != null) {
                            mEventListener.onEventDown();
                        }
                        if (getScrollY() == 0){
                            Log.e("测试", "下滑 到头了");
                            if (mEventListener != null) {
                                mEventListener.onEventPageTop();
                            }
                        }
                    } else {
                        Log.e("测试", "上滑 ");
                        if (mEventListener != null) {
                            mEventListener.onEventUp();
                        }
//                    // webview的高度
//                    float webcontent = getContentHeight() * getScale();
//                    // 当前webview的高度
//                    float webnow = getHeight() + getScrollY();
                        if((this.getHeight() + this.getScrollY())>=(this.getContentHeight() * this.getScale())){
                            Log.e("测试", "上滑 到底了");
                            if (mEventListener != null) {
                                mEventListener.onEventPageEnd();
                            }
                        }
                    }
                }




            case MotionEvent.ACTION_UP:
                if (getScrollY() == 0){
                    Log.e("测试", "下滑 到头了");
                    if (mEventListener != null) {
                        mEventListener.onEventPageTop();
                    }
                }
                
                if((this.getHeight() + this.getScrollY())>=(this.getContentHeight() * this.getScale())){
                    Log.e("测试", "上滑 到底了");
                    if (mEventListener != null) {
                        mEventListener.onEventPageEnd();
                    }
                }
                break;
        }

        return super.onTouchEvent(ev);
    }


}

其中重写onTouchEvent()可以顺便判断出滑动方向scrollFx,true 向下滑 false 向上滑。

对于判断是否滑动到底部、顶部时为了保准,在MotionEvent.ACTION_UP 抬起手指时又判断了一遍~~

            case MotionEvent.ACTION_UP:
                if (getScrollY() == 0){
                    Log.e("测试", "下滑 到头了");
                    if (mEventListener != null) {
                        mEventListener.onEventPageTop();
                    }
                }

                if((this.getHeight() + this.getScrollY())>=(this.getContentHeight() * this.getScale())){
                    Log.e("测试", "上滑 到底了");
                    if (mEventListener != null) {
                        mEventListener.onEventPageEnd();
                    }
                }

调用

        webView.setMcEventListener(object :McWebViewScroll.McEventListener{
            override fun onEventUp() {
            }

            override fun onEventDown() {
            }

            override fun onEventPageTop() {
            }

            override fun onEventPageEnd() {
            }

        })

end——————————————–

在SwipeRefreshLayout 嵌套 webview 有时会出现 webview顶部没完全显示出来时,向下滑动就会唤起SwipeRefreshLayout 的下拉刷新
解决

可用通过判断是否滑动到webview顶部,来判断是否启用下来刷新~

public class McWebViewScroll extends WebView {

    public McWebViewScroll(Context context) {
        super(context);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    public McWebViewScroll(Context context, AttributeSet attributeSet, int i) {
        super(context, attributeSet, i);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        //四个参数分别对应,当前水平滚动距离,当前垂直滚动距离,上一次水平滚动的距离,上一次垂直滚动的距离
        super.onScrollChanged(l, t, oldl, oldt);
        if (mScrollListener != null) {
            mScrollListener.onScrollChanged(t);
        }
    }

    public interface IScrollListener {
        void onScrollChanged(int scrollY);
    }

    private IScrollListener mScrollListener;

    public void setOnScrollListener(IScrollListener listener) {
        mScrollListener = listener;
    }
}

使用

        mBinding.webWv.setOnScrollListener(object : McWebViewScroll.IScrollListener {
            override fun onScrollChanged(scrollY: Int) {
                if (scrollY == 0) {
                    //启用下拉刷新

                } else {
                    //禁止下拉刷新

                }
            }

        })

原文地址:https://blog.csdn.net/NewActivity/article/details/129555644

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_8155.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注