滑动冲突是Android中的一个广泛会遇到的一类问题,本文只简单总结一次简单的滑动冲突,ViewPager的水平滑动和ScrollView的垂直方向滑动的冲突处理。
首先我们分析冲突的现象,当我们试图在ViewPager上水平滑动手指试图翻页时,很容易就误触发垂直方向的滑动事件,比如说ScrollView或一些下拉刷新控件的垂直滑动,表现为ViewPager很难滑动,或页面在抖动。
通常导致这种原因是我们的布局,ScrollView或下拉刷新控件里嵌套ViewPager等水平滑动的控件,而我们滑动的手势不可能完全的水平或垂直,也就是MotionEvent和上一次比,dx和dy都是大于0的,这样显然,ViewPager和ScrollView这两个控件会同时触发onTouch行为,导致整个滑动事件的不可靠。
由此很容易想到,解决办法就是合理区分手指的水平滑动和垂直滑动,举个例子,比如说,用户手指滑动,dx=10,dy=1,那显然的用户是想水平滑动,垂直方向的滑动不是用户期望的,那我们在View的dispatchTouchEvent(MotionEvent ev)里,主动去根据这种情况去屏蔽垂直方向控件对滑动事件的响应。
上代码:
首先你需要给ScrollView加一个方法,可以主动屏蔽和恢复手势滑动。
1 | public class LockableScrollView extends ScrollView { |
接着,重写ViewPager的dispatchTouchEvent(MotionEvent ev)方法
1 |
|
这里,一个是判断dy如果小于2倍的dx,就认为是水平滑动,这个是经验值,可以自行进行调整。效果还是很好的。