1.滑动冲突
滑动冲突是指系统不知道该将滑动事件交给哪个控件来消费。
在开发过程中遇到ViewPager嵌套ListView或者ScrollView嵌套ListView等情况时都可能会出现滑动冲突问题,这是因为ListView是纵向滑动,而ViewPager是横向滑动。虽然ListView、ViewPager类内部源码已经做好了相应的处理,使它们能同时使用,但有时为了满足自己项目的特殊需求,还是需要专门解决滑动冲突。
解决滑动冲突问题有两种方法:内部拦截法和外部拦截法。滑动冲突也存在2种场景: 横竖滑动冲突、同向滑动冲突。同向滑动和横竖滑动思路是一样的,只是用来判断是否拦截的那块逻辑不同而已。
推荐:当子元素占满父元素空间时使用外部拦截法;当没有占满时使用内部拦截。
2.外部拦截方法
外部拦截法是指所有的触摸事件都先经过父容器的传递,父容器需要此触摸事件时就可以拦截此触摸事件,不需要此触摸事件时就传递给子View。这样就可以解决滑动冲突的问题,这种方法比较符合触摸事件的传递、处理机制。
外部拦截法的思路:重写父容器的onInterceptTouchEvent方法,在该方法中根据具体的需求决定父控件是否拦截事件。如果父控件拦截了事件,则在父控件的onTouchEvent进行相应的事件处理。
举例:
重写父容器的onInterceptTouchEvent方法:
int lastInterceptX;
int lastInterceptY;
@Override
public boolean onInterceptTouchEvent( MotionEvent ev) {
boolean intercepted = false;