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處理滑動
相關文章
- Qt 事件傳遞流程-事件處理器|事件分發器|事件過濾器QT事件過濾器
- 事件處理事件
- React事件處理React事件
- vue事件處理Vue事件
- JavaSwing 事件處理Java事件
- JavaScript事件處理JavaScript事件
- Flutter | 事件處理Flutter事件
- react之事件處理React事件
- 事件分發之View事件處理事件View
- 非同步流程處理非同步
- 事件分發和處理事件
- freeswitch的event事件處理事件
- Laravel 事件&非同步處理Laravel事件非同步
- 遙感影像處理流程
- EGADS框架處理流程分析框架
- W3C的事件處理和IE的事件處理有哪些區別?事件
- tabbar凸起點選事件處理tabBar事件
- React 深入系列5:事件處理React事件
- 自定義事件相容處理物件事件物件
- Java——事件處理機制概要Java事件
- Flink - CEP(複雜事件處理)事件
- redis的事件處理機制Redis事件
- TANet資料預處理流程
- 【SQL】Oracle SQL處理的流程SQLOracle
- GPON網路故障如何處理?GPON網路故障處理流程
- snabbdom原始碼解析(七) 事件處理原始碼事件
- 第七章 事件處理器事件
- JavaScript 註冊事件處理函式JavaScript事件函式
- React 中常用的事件處理方式React事件
- 淺入深出Vue:事件處理Vue事件
- echarts 繫結事件處理函式Echarts事件函式
- 基於python的事件處理模型Python事件模型
- java事件處理模型是什麼Java事件模型
- log file sync等待事件處理思路事件
- React學習筆記-事件處理React筆記事件
- .net core 訊息流處理流程
- 大資料處理的基本流程大資料
- 原始碼解析Java Attach處理流程原始碼Java
- MySQL:亂碼問題處理流程MySql