日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android事件分發(fā)機制全面解析

瀏覽:17日期:2022-09-20 10:26:50
事件分發(fā)機制

事件分發(fā)機制的兩個階段:

分發(fā):事件從父視圖往子視圖分發(fā),被攔截后不再傳遞,進入回溯階段 回溯:事件從子視圖往父視圖回溯,被消費后不再回溯

關鍵方法:

ViewGroup.dispatchTouchEvent 往子視圖分發(fā)事件 ViewGroup.onInterceptTouchEvent 返回 true 表示攔截分發(fā)事件,不再傳遞,進入當前視圖 onTouchEvent View.dispatchTouchEvent 默認事件分發(fā),調(diào)用 onTouchEvent View.onTouchEvent 通常重載此方法處理事件,返回 true 表示消費事件,不再傳遞,返回 false 往上回溯 ViewParent.requestDisallowInterceptTouchEvent(true) 可以確保事件分發(fā)到子視圖前不被攔截

假設視圖層次為 A.B.C.D,事件分發(fā)回溯默認過程為:

A.dispatchTouchEvent B.dispatchTouchEvent C.dispatchTouchEvent D.dispatchTouchEvent D.onTouchEvent C.onTouchEvent B.onTouchEventA.onTouchEvent

假設 B 攔截了事件:

A.dispatchTouchEvent B.dispatchTouchEvent -> B.onInterceptTouchEvent B.onTouchEventA.onTouchEvent

假設 C.onTouchEvent 消費了事件:

A.dispatchTouchEvent B.dispatchTouchEvent C.dispatchTouchEvent D.dispatchTouchEvent D.onTouchEvent C.onTouchEvent

事件分發(fā)機制偽代碼:

class Activity { fun dispatchTouchEvent(ev) { if (parent.dispatchTouchEvent(ev)) { return true } return onTouchEvent(ev) } fun onTouchEvent(ev):Boolean {...}} class ViewGroup : View { fun dispatchTouchEvent(ev) { var handled = false if (!onInterceptTouchEvent(ev)) { handled = child.dispatchTouchEvent(ev) } return handled || super.dispatchTouchEvent(ev) } fun onInterceptTouchEvent(ev):Boolean {...} fun onTouchEvent(ev):Boolean {...}} class View { fun dispatchTouchEvent(ev) { var result = false if (handleScrollBarDragging(ev)) { result = true } if (!result && mOnTouchListener.onTouch(ev)) { result = true } if (!result && onTouchEvent(ev)) { result = true } return result } fun onTouchEvent(ev):Boolean {...}}ViewGroup.dispatchTouchEvent 源碼分析

1.開始:ACTION_DOWN 事件開始一個新的事件序列,清除之前觸摸狀態(tài)2.攔截:

2.1. 非 ACTION_DOWN 事件如果當前沒有子視圖消費事件,表示事件序列已被攔截2.2. 事件未被攔截且子視圖未申請禁止攔截時,再通過 onInterceptTouchEvent 嘗試攔截事件

3.分發(fā):如果事件未被攔截也未被取消,就遍歷子視圖分發(fā)事件,并尋找當前事件的觸摸目標

3.1. 在觸摸目標鏈表中找到了可以消費當前事件的視圖觸摸目標 -> 將其標記為當前觸摸目標,延遲到步驟4分發(fā)事件給它3.2. 一個不在觸摸目標鏈表中的視圖消費了事件 -> 將其標記為當前觸摸目標,并設置為觸摸目標鏈表表頭3.3. 未找到消費當前事件的視圖,但觸摸目標鏈表不為空 -> 將觸摸目標鏈表末端標記為當前觸摸目標

4.分發(fā):觸摸目標鏈表不為空,則遍歷觸摸目標鏈嘗試傳遞事件或取消觸摸目標(事件被攔截)5.回溯:觸摸目標鏈表為空(當前沒有子視圖消耗事件序列),則將事件轉(zhuǎn)發(fā)給基類 dispatchTouchEvent 處理注:觸摸目標(ViewGourp.TouchTarget) 描述一個被觸摸的子視圖和它捕獲的指針ids

public boolean dispatchTouchEvent(MotionEvent ev) { // 省略代碼 ... boolean handled = false; if (onFilterTouchEventForSecurity(ev)) { if (actionMasked == MotionEvent.ACTION_DOWN) { // 1. `ACTION_DOWN` 事件開始一個新的事件序列,清除之前觸摸狀態(tài) ... } // 省略代碼 ... final boolean intercepted; // 2. 攔截 if (actionMasked == MotionEvent.ACTION_DOWN || mFirstTouchTarget != null) { final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0; if (!disallowIntercept) {// 2.2. 事件未被攔截且子視圖未申請禁止攔截時,再通過 onInterceptTouchEvent 嘗試攔截事件intercepted = onInterceptTouchEvent(ev);// 省略代碼 ... } else {intercepted = false; } } else { // 2.1. 非 `ACTION_DOWN` 事件如果當前沒有子視圖消費事件,表示事件序列已被攔截 intercepted = true; } // 省略代碼 ... if (!canceled && !intercepted) { // 省略代碼 ... // 3. 分發(fā):如果事件未被攔截也未被取消,就遍歷子視圖分發(fā)事件,并尋找當前事件的觸摸目標 for (int i = childrenCount - 1; i >= 0; i--) { // 省略代碼 ... newTouchTarget = getTouchTarget(child); if (newTouchTarget != null) { // 3.1. 在觸摸目標鏈表中找到了可以消費當前事件的視圖觸摸目標 -> 將其標記為當前觸摸目標,延遲到步驟4分發(fā)事件給它 // 省略代碼 ... break; } if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) { // 省略代碼 ... // 3.2. 一個不在觸摸目標鏈表中的視圖消費了事件 -> 將其標記為當前觸摸目標,并設置為觸摸目標鏈表表頭 newTouchTarget = addTouchTarget(child, idBitsToAssign); alreadyDispatchedToNewTouchTarget = true; break; } // 省略代碼 ... } if (newTouchTarget == null && mFirstTouchTarget != null) { // 3.3. 未找到消費當前事件的視圖,但觸摸目標鏈表不為空 -> 將觸摸目標鏈表末端標記為當前觸摸目標 newTouchTarget = mFirstTouchTarget; while (newTouchTarget.next != null) { newTouchTarget = newTouchTarget.next; } newTouchTarget.pointerIdBits |= idBitsToAssign;} // 省略代碼 ... } // Dispatch to touch targets. if (mFirstTouchTarget == null) { // 5. 回溯:觸摸目標鏈表為空(當前沒有子視圖消耗事件序列),則將事件轉(zhuǎn)發(fā)給基類 dispatchTouchEvent 處理 handled = dispatchTransformedTouchEvent(ev, canceled, null, TouchTarget.ALL_POINTER_IDS); } else { // 省略代碼 ... // 4. 分發(fā):觸摸目標鏈表不為空,則遍歷觸摸目標鏈嘗試傳遞事件或取消觸摸目標(事件被攔截) TouchTarget target = mFirstTouchTarget; while (target != null) { final TouchTarget next = target.next; // 省略代碼 ... if (dispatchTransformedTouchEvent(ev, cancelChild, target.child, target.pointerIdBits)) { handled = true; } // 省略代碼 ... target = next; } } // 省略代碼 ... } // 省略代碼 ... return handled;}View.dispatchTouchEvent 和 View.onTouchEvent 源碼分析 滾動條消費鼠標事件 OnTouchListener 消費觸摸事件 onTouchEvent 消費觸摸事件

TouchDelegate 消費觸摸事件

public boolean dispatchTouchEvent(MotionEvent event) { // 省略代碼 ... boolean result = false; // 省略代碼 ... if (onFilterTouchEventForSecurity(event)) { // 滾動條消費鼠標事件 if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) { result = true; } // OnTouchListener 消費觸摸事件 ListenerInfo li = mListenerInfo; if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { result = true; } // View默認的事件處理邏輯,事件可能在其中被設置的 TouchDelegate 消費 if (!result && onTouchEvent(event)) { result = true; } } // 省略代碼 ... return result;} public boolean onTouchEvent(MotionEvent event) { // 省略代碼 ... if (mTouchDelegate != null) { // TouchDelegate 消費觸摸事件 if (mTouchDelegate.onTouchEvent(event)) { return true; } } // 省略代碼 ... return false;}

以上就是Android事件分發(fā)機制全面解析的詳細內(nèi)容,更多關于Android事件分發(fā)機制的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久草免费在线视频| 精品欧美一区二区三区在线观看| 国产一区二区三区黄网站 | 日韩精品2区| 久久久久久色 | 日韩欧美1区| 国产欧美自拍一区| 国产精品一线天粉嫩av| 国产日韩欧美一区在线| 欧美日韩亚洲一区在线观看| 69精品国产久热在线观看| 亚洲精品系列| 亚洲综合中文| 日韩精品免费视频一区二区三区| 免费人成在线不卡| 日韩欧美高清一区二区三区| 蜜臀av亚洲一区中文字幕| 久久精品国产免费| av免费不卡国产观看| 91一区二区三区四区| 日韩成人综合| 色综合狠狠操| 久久天堂av| 激情久久中文字幕| 日韩一区二区久久| 视频在线观看91| 亚洲开心激情| 欧美日韩xxxx| 美女视频免费精品| 给我免费播放日韩视频| 亚洲成人不卡| 国产精品日韩| 日韩精品免费观看视频| 国产精品视频一区二区三区四蜜臂| 国产精品一区二区99| 精品久久电影| 六月婷婷综合| 欧美日韩高清| 涩涩涩久久久成人精品| 国产精品三p一区二区| 97精品视频在线看| 欧美日韩国产免费观看视频| 国产精品一区二区中文字幕| 色综合五月天| 亚洲免费网址| 欧美视频二区| 亚洲伦乱视频| 在线精品亚洲| 久久亚州av| 欧美成人午夜| 欧美亚洲一级| 久久精品国产亚洲一区二区三区| 日韩一区三区| 久久国产精品毛片| 国产精品白丝av嫩草影院| 92国产精品| 免费人成在线不卡| 国内不卡的一区二区三区中文字幕| 久久久久美女| 日韩精品午夜视频| 欧美日韩免费观看视频| 中文字幕一区二区三区在线视频| 欧美1区2区3| 欧美在线亚洲| 国产精品一区二区三区www| 久久久五月天| 亚洲特级毛片| 欧美日韩亚洲一区三区| 亚洲欧美日韩专区| 你懂的国产精品永久在线| 亚洲国产综合在线看不卡| 日韩欧乱色一区二区三区在线| 欧美韩日一区| 亚洲欧美久久精品| 精品捆绑调教一区二区三区| 亚洲一二三区视频| 超级白嫩亚洲国产第一| 亚洲精品观看| 精精国产xxxx视频在线野外| 欧美日韩a区| 91久久中文| 国产欧美亚洲精品a| 欧美亚洲激情| 麻豆成人综合网| 人人爽香蕉精品| 成人日韩在线观看| 日韩不卡手机在线v区| 99免费精品| 美女国产一区二区三区| 亚洲影院天堂中文av色| 91精品国产成人观看| 国产精品久久乐| 免费在线欧美视频| 欧美日韩亚洲在线观看| 国产精品对白久久久久粗| 亚洲少妇一区| 精品香蕉视频| 日韩二区在线观看| 野花国产精品入口| 吉吉日韩欧美| 久久久亚洲欧洲日产| 一区二区亚洲视频| 久久精品国产www456c0m| 嫩呦国产一区二区三区av| 色8久久久久| 老牛国产精品一区的观看方式| 伊人久久国产| 久久av影视| 日韩avvvv在线播放| 久久国产精品99国产| 久久一区二区中文字幕| 国产精品视频一区视频二区| 日韩三区四区| 日韩制服丝袜先锋影音| jiujiure精品视频播放| 久久久男人天堂| 国产精品www.| 久久国产精品免费一区二区三区| 免费在线欧美视频| 亚洲欧美不卡| 欧美特黄一级| 香蕉人人精品| 久久久人人人| 九九精品调教| 日韩大片在线| 国产成人精品亚洲日本在线观看| 免费在线欧美黄色| 国产伦乱精品| 国产精品天天看天天狠| 国产欧美综合一区二区三区| 亚洲三级毛片| 亚洲影视一区二区三区| 久久aⅴ国产紧身牛仔裤| 伊人久久亚洲美女图片| 国产高清一区二区| 亚洲国产一区二区在线观看| 亚洲高清久久| 最新日韩av| 亚洲欧美视频一区二区三区| 午夜精品婷婷| 99riav1国产精品视频| 欧美粗暴jizz性欧美20| 一区二区三区视频免费观看| 亚洲黑丝一区二区| 伊人久久婷婷| 视频一区在线视频| 亚洲欧美专区| 日本va欧美va精品| 国产探花一区| 你懂的国产精品永久在线| 久久精品国产免费| 神马久久午夜| 99视频精品全国免费| 狠狠干成人综合网| 综合激情在线| 国产精品嫩草影院在线看| 久久这里只有| 欧美成人精品三级网站| 99re国产精品| 91亚洲精品在看在线观看高清| 国产高清亚洲| 日韩免费在线| 爽好多水快深点欧美视频| 欧美一级二级视频| 国产精品99视频| 久久精品青草| 日韩综合小视频| 精品午夜av| 亚洲激情不卡| 国产精品黄色| 91精品啪在线观看国产18| 麻豆精品网站| 国产精品久久久久久久久久齐齐| 国产精品精品| 爽爽淫人综合网网站| 一区二区三区四区在线观看国产日韩| 日本不卡的三区四区五区| 日韩在线网址| 亚洲欧美伊人| 91成人网在线观看| 91亚洲无吗| 久久91视频| 视频小说一区二区| 亚洲一级高清| 久久国产免费看| 国际精品欧美精品| 中文字幕在线官网| 九色porny丨国产首页在线| 免费成人网www| 青青草国产成人99久久| 精品国产精品国产偷麻豆| 久久美女性网| 丝袜美腿亚洲色图| 成人国产精品久久| 亚州av乱码久久精品蜜桃| 亚洲精选成人| 国语精品一区| 久久国产精品99国产| 国产免费av国片精品草莓男男| 精品网站999|