让ViewPager不可以滚动

本文深入探讨了ViewPager如何通过重写onInterceptTouchEvent和onTouchEvent方法实现滚动拦截。实验表明,仅重写其中一个方法无法完全阻止滚动,必须同时重写两个方法并移除默认行为才能达到目的。

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

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

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

在ViewPager中onInterceptTouchEvent源代码里有这样一行注释 /*

  • 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. */ 可见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的那些行为.

转载于:https://my.oschina.net/tanghaoo/blog/735019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值