判断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 {

//禁止下拉刷新

}

}

})

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: