最近项目开发中,许多地方用到了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);
}