美文网首页
VerticalViewPager 嵌套 ScrollView

VerticalViewPager 嵌套 ScrollView

作者: kalshen | 来源:发表于2018-04-20 14:42 被阅读89次
简单暴力

覆写两个方法,不再像个傻*一样去判断 MotionEvent

/**
 * Created by kalshen on 2018/4/20.
 * 傻*scrollView
 * 垂直viewpager和scrollview的滚动冲突解决
 */
public class FoolishScrollView extends ScrollView {

    private boolean isOverScroll = false;

    public FoolishScrollView(Context context) {
        super(context);
    }

    public FoolishScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
        isOverScroll = clampedY;
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (!isOverScroll) { //通知ViewPager不要干扰自身的操作
            getParent().requestDisallowInterceptTouchEvent(true);
            return super.onTouchEvent(ev);
        } else {
            getParent().requestDisallowInterceptTouchEvent(false);
            return isOverScroll = false;//这里需要重置isOverScroll
        }
    }
}
顺便再给你一个网络修复版
public class MyScrollView extends ScrollView {
    public MyScrollView(Context context) {
        super(context);
    }

    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private boolean mCanScroll = true;
    private float mDownY;

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mDownY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int scrollY = getScrollY();
                //滑到顶部或底部
                if ((scrollY == 0 && mDownY <= ev.getY())
                        || (getChildAt(0).getMeasuredHeight() == (scrollY + getHeight()) && mDownY >= ev.getY())) {
                    mCanScroll = false;
                }
                break;
            case MotionEvent.ACTION_UP:
                mCanScroll = true;
                break;
            case MotionEvent.ACTION_CANCEL:
                mCanScroll = true;
                break;
        }
        if (mCanScroll) { //通知ViewPager不要干扰自身的操作
            getParent().requestDisallowInterceptTouchEvent(true);
            return super.onTouchEvent(ev);
        } else {
            getParent().requestDisallowInterceptTouchEvent(false);
            return false;
        }
    }
}

两个随便选一个用就可以了。

相关文章

网友评论

      本文标题:VerticalViewPager 嵌套 ScrollView

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