android 监听webview 滑动方向以及是否滑动到顶部、底部
创始人
2025-05-28 15:47:25
0

判断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);}@Overrideprotected 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 向上滑@Overridepublic 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);}@Overrideprotected 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 {//禁止下拉刷新}}})

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...