判断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 { //禁止下拉刷新 } } })
来源地址:https://blog.csdn.net/NewActivity/article/details/129555644