SlidingMenu事件處理流程
介紹:SlidingMenu分為SlidingMenu.java,CustomViewBehind.java,CustomViewAbove.java,核心檔案
SlidingMenu.java繼承自RelativeLayout類,包含CustomViewBehind.java,CustomViewBehind.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,當有View的onTouchEvent返回TRUE時,結束事件傳遞以後事件就直接分發給該view,如果沒有事件回傳給上層View的onTouchEvent,一般底層都有可能有事件攔截
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_MOVE,ACTION_UP
同上,區別
事件直接傳遞給子ViewGroup
需求:
有時候我們希望滑動選單項也可以關閉選單
設定,setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);可是點選選單項就沒有反應了,
問題是,
事件傳遞到CustomViewAbove-->onTouchEvent 被它攔截了,事件就傳遞不到CustomViewBehind,所有點選事件被攔截了,
解決的方法:
當選單開啟時候,CustomViewAbove-->onTouchEvent 不要攔截事件,事件傳遞給CustomViewBehind,在CustomViewBehind的onInterceptTouchEvent方法中判斷是不是滑動如果是滑動,攔截事件,交給onTouchEvent處理滑動
相關文章
- 事件處理事件
- 從點選螢幕到事件處理的事件分發原始碼流程事件原始碼
- Android KeyEvent 點選事件分發處理流程(一)Android事件
- Cocoa Touch事件處理流程--響應者鏈(轉載)事件
- Flutter | 事件處理Flutter事件
- JavaScript事件處理JavaScript事件
- React事件處理React事件
- vue事件處理Vue事件
- IE事件處理事件
- 事件相容處理事件
- JS事件處理JS事件
- javaScript事件(二)事件處理程式JavaScript事件
- 非同步流程處理非同步
- KafkaSpout的處理流程Kafka
- BIEE 之 處理流程
- react之事件處理React事件
- wx處理滑鼠事件事件
- 事件分發之View事件處理事件View
- 事件冒泡、事件捕獲、DOM0級事件處理程式、DOM2級事件處理程式事件
- 遙感影像處理流程
- Mongodb請求處理流程MongoDB
- 關於Disruptor處理流程
- 事件分發和處理事件
- Laravel 事件&非同步處理Laravel事件非同步
- java中的事件處理Java事件
- DFS lock handle事件處理事件
- 【SQL】Oracle SQL處理的流程SQLOracle
- EGADS框架處理流程分析框架
- SpringMVC請求處理流程SpringMVC
- DG發現gap處理流程
- nginx處理http請求流程NginxHTTP
- React 深入系列5:事件處理React事件
- tabbar凸起點選事件處理tabBar事件
- freeswitch的event事件處理事件
- redis的事件處理機制Redis事件
- Java——事件處理機制概要Java事件
- 自定義事件相容處理物件事件物件
- Delphi處理TWebBrowser的Close事件Web事件