判断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顶部,来判断是否启用下来刷新~文章来源:https://www.toymoban.com/news/detail-608424.html
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模板网!