android ViewPager嵌套WebView滑动冲突问题

2019-03-06  本文已影响0人  wfunny

最近在项目中遇到一个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滑动冲突问题啦。

参考文章
android ViewPager嵌套WebView滑动冲突问题解决

上一篇下一篇

猜你喜欢

热点阅读