需求
ViewPager下的Fragment又包含ViewPager,需要Fragment中ViewPager不能滑动
最初实现
![](https://img.haomeiwen.com/i3356042/ac86679b3ebbd0f6.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;
}
}
最终效果
![](https://img.haomeiwen.com/i3356042/2f6b4166d2ab9459.gif)
网友评论