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

这篇具有很好参考价值的文章主要介绍了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;
    }
}

使用:文章来源地址https://www.toymoban.com/news/detail-608424.html

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

                } else {
                    //禁止下拉刷新

                }
            }

        })

到了这里,关于android 监听webview 滑动方向以及是否滑动到顶部、底部的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js:scroll平滑滚动页面或元素到顶部或底部的方案汇总

    准备知识: scrollWidth: 是元素全部内容的宽度,包括由于overflow溢出而在屏幕上不可见的内容 scrollHeight: 是元素全部内容的高度,包括由于overflow溢出而在屏幕上不可见的内容 scrollTop: 纵向滚动条距离元素最顶部的距离 scrollLeft: 横向滚动条距离元素最左侧的距离 语法 参数 -

    2024年02月09日
    浏览(37)
  • echarts图表动态监听dataZoom滑动,控制柱条的宽度以及数值的显示隐藏

    当数值过多时,显示所有柱条看着会很凌乱且文字会挤在一起,于是就需要监听datazoom的滑动,拿到对应的阈值后做出相应的配置。 “ dataZoom ” 事件通常用于响应用户对图表进行数据缩放的操作。 这里是datazoom官网api地址:点击跳转至官网文档的datazoom介绍 初始时 状态如下

    2024年04月13日
    浏览(46)
  • 微信小程序webview跳转页面后没有返回按钮以及变向解决H5安卓无法监听popstate问题

    做了一个app跳转到小程序关注公众号的需求,小程序里面用webview嵌套公众号的H5。 做完我发现左上角它没!有!返!回!键! 然后!我查了好多资料用过双页面跳转让左上角有返回键,但是吧,它确实是有返回键了但是没办法返回到小程序 ,只是在H5内不停的返回在跳转回

    2024年04月12日
    浏览(53)
  • 【Android 逆向】程序员高危开发方向 ( 违法软件类型 | 赌博游戏 | 色情类应用 | 涉及金融类软件 | 爬虫类软件 | 区块链货币 | 甄别是否合法 )

    棋牌类 游戏开发 , 写这类游戏的程序员 很容易被抓 , 只要 涉及到了 充值 以及 提现 , 就是涉嫌赌博 ; 常见的 就是 麻将类游戏 , 纸牌类游戏 , 具体的地方麻将或扑克玩法 , 德州扑克 , 21 点 , 老虎机 等 类型的 游戏 ; 抽卡类的游戏 , 充值 然后 赌概率 , 比如原神这种 , 只充值

    2024年01月19日
    浏览(47)
  • 试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点a到顶点b的路径

    试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点a到顶点b的路径,注意a!=b(必须严格按照样例进行输入输出,先输入图的顶点数和弧数,并依次输入弧的相关信息,最后输入要判断的两个顶点的信息) 样例如下: 输入: 5 4 2 4 2 1

    2024年02月15日
    浏览(41)
  • h5,微信小程序弹出层底部禁止滑动

    1.如果弹窗内容不可滑动,仅展示 方案一:只需要给弹窗蒙层加上 @touchmove.prevent 即可实现,无兼容性问题 方案二:在弹窗蒙层加上touch-action:none; 方案三:打开弹窗时,设置body的overflow属性为hidden并阻止默认事件 关闭弹窗时设置body的overflow属性为\\\"\\\"并移除阻止默认事件 2. 如

    2024年02月07日
    浏览(48)
  • 微信小程序布局固定底部且不随页面滑动(帖子评论)

     博主介绍: 本人专注于Android/java/数据库/微信小程序技术领域的开发,以及有好几年的计算机毕业设计方面的实战开发经验和技术积累;尤其是在安卓(Android)的app的开发和微信小程序的开发,很是熟悉和了解;本人也是多年的Android开发人员;希望我发布的此篇文件可以帮

    2024年04月22日
    浏览(64)
  • uniApp监听左右滑动事件

    监听左右滑动事件的步骤 1. 添加需要监听滑动事件的元素 在你的页面中,添加需要监听滑动事件的元素。这可以是一个 view 、 swiper 或其他组件,取决于你的需求。例如: uniapp的滑动事件我也是感觉挺不错的,关键是能够实现局部滑动,这一点就非常的棒。 2. 编写事件处理

    2024年02月09日
    浏览(36)
  • uniapp 小程序 监听数据渲染完毕 获取高度 滚动条滚动到最底部

    nextTick : 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。 滚动条用的scroll-view标签 写一个聊天项目 实现发送消息、进入页面滚动到最底部 滚动方法pageScrollTo总是在渲染前执行 导致无法滚动到最底部 数据渲染完成获取元素

    2024年02月11日
    浏览(38)
  • 微信小程序——监听页面滑动(一)onPageScroll

    知识专栏 专栏链接 微信小程序专栏 https://blog.csdn.net/xsl_hr/category_12338067.html?spm=1001.2014.3001.5482 微信小程序——Git版本管理 https://blog.csdn.net/XSL_HR/article/details/130986889?spm=1001.2014.3001.5501 有关 微信小程序 的相关知识可以前往微信小程序官方文档查看了解!! 微信小程序官方文档

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包