判断webview 滑动方向,老生常谈的问题,再次提及。
监听webview是否滑动到底部、顶部,可以通过重新webview的onScrollChanged()或者onTouchEvent()判断。
其中通过重写onTouchEvent()可以判断出webview的滑动方向。
判断是否滑动到底部,是通过判断webview的高度与当前webview的高度做比较得出。
判断是否滑动到顶部,是通过判断webview的getScrollY() == 0 得出。
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) {}})
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 {//禁止下拉刷新}}})