美文网首页
ViewPager嵌套

ViewPager嵌套

作者: tesla1984 | 来源:发表于2018-09-12 13:32 被阅读0次

需求

ViewPager下的Fragment又包含ViewPager,需要Fragment中ViewPager不能滑动

最初实现

1.gif

思路一

Fragment中使用禁止滑动的viewpager

public class NoScrollViewPager extends ViewPager {

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

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

    //表示事件是否拦截,返回false表示不拦截
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
    }

    //重写onTouchEvent事件,什么都不用做
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return false;
    }
}

思路二

Activity中的ViewPager重写canScroll方法,在 ViewPager的onInterceptTouchEvent有下面这段

@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        /*
         * This method JUST determines whether we want to intercept the motion.
         * If we return true, onMotionEvent will be called and we do the actual
         * scrolling there.
         */

        final int action = ev.getAction() & MotionEventCompat.ACTION_MASK;

        switch (action) {
            case MotionEvent.ACTION_MOVE: {
             
                if (dx != 0 && !isGutterDrag(mLastMotionX, dx) &&
                        canScroll(this, false, (int) dx, (int) x, (int) y)) {
                    // Nested view has scrollable area under this point. Let it be handled there.
                    mLastMotionX = x;
                    mLastMotionY = y;
                    mIsUnableToDrag = true;
                    return false;
                }
               //....
                break;
            }

            case MotionEvent.ACTION_DOWN: {
            
        }
        return mIsBeingDragged;
    }

canScroll方法就是判断ViewPager的子View能否横向滑动,如果可以横向滑动则不拦截事件,将事件传递到子View上。在这里我们可以让canScroll方法直接返回false

/**
 * User: liang.li
 * Date: 2018/9/11
 * Time: 20:44
 * canScroll=false 屏蔽掉子view滑动事件
 */
public class ScrollViewPager extends ViewPager {


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

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


    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        return false;
    }
}

最终效果

项目地址

2.gif

相关文章

网友评论

      本文标题:ViewPager嵌套

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