現象:側滑菜單打開後,主界面 ListView 無法滑動。根因是觸摸事件分發機制:SlidingMenu 攔截了觸摸事件,導致 ListView 的 onTouchEvent 不再接收到 ACTION_MOVE。
onTouchEvent 中,ACTION_DOWN 時調用 getParent().requestDisallowInterceptTouchEvent(true),告訴 SlidingMenu「這次滑動歸我管」public class MyListView extends ListView {
private float xDown, yDown;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDown = ev.getX(); yDown = ev.getY();
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
float dx = Math.abs(ev.getX() - xDown);
float dy = Math.abs(ev.getY() - yDown);
if (dx > dy) { // 水平滑動,交給 SlidingMenu
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
}
return super.onInterceptTouchEvent(ev);
}
}
DrawerLayout (官方組件) 替代 SlidingMenu,原生支持嵌套滑動