VerticalViewPager 嵌套 ScrollView 滑动冲突(极简)

简单暴力

覆写两个方法,不再像个傻*一样去判断 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;
        }
    }
}

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 有一种忧伤叫青春 (胤歆) 从那一天,或者从那一刻,阳光散落一地,亲吻着面颊,沿...
    胤歆阅读 1,634评论 0 1
  • 从前,有一个年轻人,他每晚都噩梦缠身,痛苦万分。 睡眠成了他最害怕的事,他甚至不敢睡觉,生怕遇到大头鬼来抓他。他四...
    茶痴阅读 3,870评论 0 1

友情链接更多精彩内容