ScrollView,ViewPager,ListView等可滚

作者: koala_ | 来源:发表于2017-06-26 15:16 被阅读189次
    ScrollView,ViewPager,ListView等可滚动的View嵌套WebView时的滑动冲突处理

    如何优雅的解决这些复杂嵌套的滚动事件处理:

    android的webView给我提供了这个回调方法onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY)。

    重写这个回调方法,它会告诉我们一些滚动事件。
    我们来看它返回的4个参数:

    • scrollX:当前View的横向滚动距离

    • scrollY:当前View的纵向滚动距离

    • clampedX:当前View横向方向是否还可滚动

    • clampedY:当前View纵向方向是否还可滑动

    有了上面这些条件在配合requestDisallowInterceptTouchEvent()就可以顺利的实现滑动了。
    requestDisallowInterceptTouchEvent()简单的来说就是告诉父View当前事情是我来处理还是父View来处理。
    传true时告诉父View滑动事件我自己处理;
    传false时告诉父View滑动时间你来处理;
    下面帖上完整代码处理ViewPager嵌套WebView:

    public class ScrollWebView extends WebView {
    
    public ScrollWebView(Context context) {
        super(context);
    }
    
    public ScrollWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    public ScrollWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    
    private boolean isScrollX = false;
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (MotionEventCompat.getPointerCount(event) == 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;
    }
    }
    

    相关文章

      网友评论

        本文标题:ScrollView,ViewPager,ListView等可滚

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