SlidingMenu事件處理流程

zhifeng687發表於2015-12-04

介紹:
SlidingMenu分為SlidingMenu.java,CustomViewBehind.java,CustomViewAbove.java,核心檔案
SlidingMenu.java繼承自RelativeLayout類,包含CustomViewBehind.javaCustomViewBehind.java,兩個View
CustomViewBehind.java繼承自ViewGroup,作為後面顯示的選單View
CustomViewAbove.java繼承自ViewGroup,作為前面顯示的主View
事件:
當選單項隱藏時
當使用者操作View也就是CustomViewAbove時,事件首先由上向下分發
ACTION_DOWN
1.SlidingMenu-->dispatchTouchEvent-->onInterceptTouchEvent
2.CustomViewAbove-->dispatchTouchEvent-->onInterceptTouchEvent是否攔截,如果攔截呼叫本類的onTouchEvent,如果不攔截,繼續向CustomViewAbove子類傳遞,一直傳遞到最裡層View,當有ViewonTouchEvent返回TRUE時,結束事件傳遞以後事件就直接分發給該view,如果沒有事件回傳給上層ViewonTouchEvent,一般底層都有可能有事件攔截
3.此時事件不會傳遞到CustomViewBehind。因為這個View為不可見狀態
ACTION_MOVE
事件傳遞原理同上,不同之處在於
1.CustomViewAbove-->dispatchTouchEvent-->onInterceptTouchEvent會判斷手勢是否是滑動(如左)如果不是返回false不攔截,表明是點選事件,如果符合滑動規則返回true攔截事件,就會呼叫本類的onTouchEvent,處理滑動事件,移動View,展現後面選單。
ACTION_UP
1.CustomViewAbove如果是移動事件抬起,恢復或者展開選單


當選單展開時,點選右邊的CustomViewAbove,事件處理如下
ACTION_DOWN
1.SlidingMenu-->dispatchTouchEvent-->onInterceptTouchEvent
2.CustomViewAbove-->dispatchTouchEvent-->onInterceptTouchEvent判斷是否是點選了右邊的CustomViewAbove,如果是的,認為是想關閉選單,設定快速關閉變數為true,返回true攔截事件,呼叫本類的onTouchEvent方法,返回true,後面的事件就傳遞給本類
3.事件不會傳遞到CustomViewBehind,因為事件被攔截
ACTION_MOVE
同上,區別
1.CustomViewAbove中的onTouchEvent判斷滑動的方向,符合條件,開始滑動
ACTION_UP
如果快速關閉變數為true,關閉選單

當選單展開時,點選右邊的CustomViewAbove也就是選單時,事件處理如下
ACTION_DOWN
1.SlidingMenu-->dispatchTouchEvent-->onInterceptTouchEvent
2.CustomViewAbove-->dispatchTouchEvent-->onInterceptTouchEvent判斷是不是攔截
3.CustomViewBehind-->dispatchTouchEvent-->onInterceptTouchEvent不做處理
ACTION_MOVEACTION_UP
同上,區別
事件直接傳遞給子ViewGroup

需求:
有時候我們希望滑動選單項也可以關閉選單
設定,setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);可是點選選單項就沒有反應了,
問題是,
事件傳遞到CustomViewAbove-->onTouchEvent 被它攔截了,事件就傳遞不到CustomViewBehind,所有點選事件被攔截了,
解決的方法:
當選單開啟時候,CustomViewAbove-->onTouchEvent 不要攔截事件,事件傳遞給CustomViewBehind,在CustomViewBehindonInterceptTouchEvent方法中判斷是不是滑動如果是滑動,攔截事件,交給onTouchEvent處理滑動

相關文章