天天看点

让ViewPager不可以滚动

关于ViewPager滚动的拦截 首先得知道他怎么就可以滚动了. 才有可能去拦截他,不让他滚动.

那么关于触摸事件,想当然的就会想到onInterceptTouchEvent方法和onTouchEvent方法.

当一个ViewGroup的onInterceptTouchEvent方法决定拦截事件了以后. 那么该viewgroup的onTouchEvent方法才会得以调用.

在ViewPager中onInterceptTouchEvent源代码里有这样一行注释 可见ViewPager的滚动是在onTouchEvent处理的. 能够进入onTouchEvent方法的前提是onInterceptTouchEvent决定要拦截event了.

那么如果我继承ViewPager并且在onInterceptTouchEvent方法中直接不拦截. 那么就不会进入onTouchEvent方法中相关控制滚动的逻辑.就不可以滚了应该是.

实验结果是直接在onInterceptTouchEvent方法中返回false并不能导致ViewPager滚动不了? 但是为什么? 如果我在onInterceptTouchEvent里返回false了是不是onTouchEvent方法就不会被调用.

实验结果是OnTouchEvent方法依然会被调用.所以并没有导致ViewPager不滚动. 那么如果我重写onTouchEvent方法.随便返回一个boolean 只要不调用super的处理行为.应该就能拦截了.

不重写onInterceptTouchEvent方法,并且重写onTouchEvent方法.直接返回true. 表现出来就是.ViewPager是不能滚动了.但是一开始还是有一点点滚动.

尝试不重写onInterceptTouchEvent方法,并且重写onTouchEvent方法返回false呢. 还是一样的结果.还是会有一丢丢滚动.

那么这一丢丢滚动是从哪里来的? 是从onInterceptTouchEvent方法里处理的? 如果是那么直接重写onInterceptTouchEvent方法返回false不拦截.并且onTouchEvent随便返回一个值,应该好使了.

实验说明onTouchEvent返回false.是好使的满足要求的. 那么onTouchEvent方法返回true会怎么样呢? 依然好使,没有什么影响.

原因大概是这样.事件能够得以分发的child.如果child的onTouchEvent方法不消费掉事件的话, 也即child的onTouchEvent方法return false.那么该child的ViewGroup的onTouchEvent方法 就会被调用.所以这里要想ViewPager不滚动,必须重写onInterceptTouchEvent和onTouchEvent方法.干掉super的那些行为.

版权声明:本文为CSDN博主「weixin_33728268」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_33728268/article/details/91973354