美文网首页
android ViewPager嵌套WebView滑动冲突问题

android ViewPager嵌套WebView滑动冲突问题

作者: wfunny | 来源:发表于2019-03-06 11:26 被阅读0次

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

    相关文章

      网友评论

          本文标题:android ViewPager嵌套WebView滑动冲突问题

          本文链接:https://www.haomeiwen.com/subject/onqtpqtx.html