解决WebView滑动监听问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决WebView滑动监听问题相关的知识,希望对你有一定的参考价值。
参考技术A 有些时候我们需要监听webview的滚动事件,但WebView没有直接监听滑动的方法,看WebView的源码则会发现有一个protected void onScrollChanged(int l, int t, int oldl, int oldt)方法。这个方法。是受到保护的所以我们无法直接使用,所以我们写一个加强的WebView,重写onScrollChanged方法并利用接口回调。
使用:
做个笔记,便于下次使用😊
ViewPager和WebView滑动冲突问题
最近项目开发中,许多地方用到了WebView,这样会出现一个问题就是WebView滑动和ViewPager滑动冲突,网上找了很多方案,终于借鉴这篇文章的思路解决了问题
具体原理都是参考的文章解决的。
代码段
只需要重写WebView下面方法就可以完成了,不需要与js交互。
//最大递归深度
int MAX_PARENT_DEPTH = 3;
//在WebView的onTouchEvent事件为ACTION_DOWN时,查找父视图是否是可以滑动的视图(如ViewPager),
// 如果是,则通过requestDisallowInterceptTouchEvent(true)调用,请求父视图不要拦截touchEvent
@Override
public boolean onTouchEvent(MotionEvent event)
if (event.getAction() == MotionEvent.ACTION_DOWN)
ViewParent viewParent = findViewParentIfNeeds(this, MAX_PARENT_DEPTH);
if(viewParent != null)
viewParent.requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(event);
/**
* 查找父布局是是否是可滑动的View
* @param tag
* @param depth 最大递归深度,防止出现死循环
* @return
*/
private ViewParent findViewParentIfNeeds(View tag, int depth)
if (depth < 0)
return null;
ViewParent parent = tag.getParent();
if (parent == null)
return null;
if (parent instanceof ViewGroup)
if (canScrollHorizontally((View) parent) || canScrollVertically((View) parent))
return parent;
else
// 增加最大递归深度判断,防止出现ANR或者异常
return findViewParentIfNeeds((View) parent, depth - 1);
return null;
/**
* 是否可以横向滑动
*/
private boolean canScrollHorizontally(View view)
return view.canScrollHorizontally(100) || view.canScrollHorizontally(-100);
/**
* 是否可以纵向滑动
*/
private boolean canScrollVertically(View view)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
return false;
return view.canScrollVertically(100) || view.canScrollVertically(-100);
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY)
Log.e("onOverScrolled", "scrollX=" + scrollX + ";scrollY=" + scrollY
+ ";clampedX=" + clampedX + ";clampedY=" + clampedY);
// 解决webview与viewpager等滑动手势冲突问题
if (clampedX || clampedY)
ViewParent viewParent = findViewParentIfNeeds(this, MAX_PARENT_DEPTH);
if (viewParent != null)
viewParent.requestDisallowInterceptTouchEvent(false);
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
以上是关于解决WebView滑动监听问题的主要内容,如果未能解决你的问题,请参考以下文章
webview_flutter滑动存在卡顿问题的完美解决方法