关于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