最近在项目中遇到一个h5与android混合开发的问题,在一个activity使用ViewPager+Fragment结构,某个Fragment包含了一个webview。而在这个webview展示的h5里有一个横屏轮播的元素,此时当我们横向滑动的时候,大多数情况下是ViewPager在滑动(这里说是大多数情况是不考虑网页可以横向滑动的特殊情况)。因此我们需要判断并处理事件。
而且在ViewPager, ScrollView, ListView等容器控件中内嵌了webview,特别是webview的大小固定的情况下,会出现滑动的冲突,可以采用如下自定义的webview来完美解决。原理就是事件的拦截机制。
/**
* 主要解决viewPager嵌套webView横向滚动问题
*/
public class ScrollConflictWebView extends WebView {
private boolean isScrollX = false;
public ExtendedWebView(Context context) {
super(context);
}
public ExtendedWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getPointerCount()== 1) { //单指操作
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isScrollX = false;
//事件由webview处理
getParent().getParent()
.requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
//嵌套Viewpager时
getParent().getParent()
.requestDisallowInterceptTouchEvent(!isScrollX);
break;
default:
getParent().getParent()
.requestDisallowInterceptTouchEvent(false);
}
} else { //双指操作
//使webview可以双指缩放(前提是webview必须开启缩放功能,并且加载的网页也支持缩放)
getParent().getParent().
requestDisallowInterceptTouchEvent(true);
}
return super.onTouchEvent(event);
}
//当webview滚动到边界时执行
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
isScrollX = clampedX;
}
}
总结
这个方法是通过验证了的,真是可行。而且webview中js控制的轮播效果也出来了。当滑动webview的轮播控件,可以轮播了, 而且ViewPager,tab不会切换,但是滑到到边界时,会响应viewPage的滑动事件,tab切换,滑动非webview的轮播地方,也会响应viewPage的事件,tab切换。所以该方法完美解决了ViewPager嵌套WebView滑动冲突问题啦。