在我们做项目过程中经常会碰到事件冲突问题,比如一个scrollView嵌套一个listview,viewpager嵌套viewpager等情况,当我们在滑动屏幕时,如果我们不做处理的情况是父布局有可能会拦截事件然后消费掉的,那如何让父布局不拦截让子view消费呢?
我这边有一个比较简单的方式去实现,那就是重写子view的dispatchTonchEvent()方法。然后在里面调用一个很好用的方法,这个方法就是:getParent().requestDisallowInterceptTouchEvent(boolen b),里面的参数如果传true表示父布局不拦截,如果传false表示父布局拦截。下面我贴上部分代码如下:
@Override public boolean dispatchTouchEvent(MotionEvent ev) { final int action = ev.getAction(); getParent().requestDisallowInterceptTouchEvent(false); switch (action) { case MotionEvent.ACTION_DOWN: mTouchStartX = ev.getX(); mTouchStartY = ev.getY(); break; case MotionEvent.ACTION_MOVE: final float touchDistanceX = ev.getX() - mTouchStartX; final float touchDistanceY = ev.getY() - mTouchStartY; if (touchDistanceX < 0) { //如果从右往左滑动 getParent().requestDisallowInterceptTouchEvent(true); } else if(touchDistanceX > 0){ //如果从左往右滑动 getParent().requestDisallowInterceptTouchEvent(true); } } return super.dispatchTouchEvent(ev); }