Android ViewPager禁止滑动方法及原理

  • 想要ViewPager禁止滑动,就要破坏它现有的事件分发消耗的逻辑.
  1. dispatchTouchEvent:分发事件
  2. onInterceptTouchEvent:拦截事件
  3. onTouchEvent:消耗事件
  • ViewPager中重写了onInterceptTouchEvent,onTouchEvent方法,禁止ViewPager滑动无非是让ViewPager无法消耗手指触发的事件.
  1. 让ViewPager永远不要拦截手指触发的事件,onInterceptTouchEvent返回false.
  2. 让ViewPager永远不要消耗手指触发的事件,onTouchEvent返回false.
  3. ViewPager继承自ViewGroup,使用时肯定要添加子View.禁止ViewPager滑动就是不消耗手指事件,但是不能破坏ViewPager原来的事件分发逻辑,不要去动ViewPager中的dispatchTouchEvent().
public class NoScrollViewPager extends ViewPager {
    // false 禁止ViewPager左右滑动。
    // true 普通ViewPager
    private boolean isScroll = false;

    public NoScrollViewPager(@NonNull Context context) {
        this(context, null);
    }
    public NoScrollViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public void setScrollable(boolean isScroll) {
        this.isScroll = isScroll;
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (!isScroll){
            // 不允许拦截事件就返回false
            return isScroll;
        }else {
            // 正常ViewPager处理拦截事件就请求父类普通ViewPager中的onInterceptTouchEvent()
           return super.onInterceptTouchEvent(ev)
        }
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (!isScroll){
            // 不允许消费事件就返回false.
            return isScroll;
        }else {
            // 正常ViewPager消耗事件就请求父类普通ViewPager中的onTouchEvent.
           return super.onTouchEvent(ev)
        }
    }
}

你可能感兴趣的:(Android ViewPager禁止滑动方法及原理)