android 监听webview 滑动方向以及是否滑动到顶部、底部

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

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

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

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

判断是否滑动到顶部,是通过判断webview的getScrollY() == 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 {
                    //禁止下拉刷新

                }
            }

        })

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值