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

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

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

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

關(guān)鍵方法:

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

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

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

假設(shè) B 攔截了事件:

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

假設(shè) 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. 一個不在觸摸目標鏈表中的視圖消費了事件 -> 將其標記為當前觸摸目標,并設(shè)置為觸摸目標鏈表表頭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. 一個不在觸摸目標鏈表中的視圖消費了事件 -> 將其標記為當前觸摸目標,并設(shè)置為觸摸目標鏈表表頭 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默認的事件處理邏輯,事件可能在其中被設(shè)置的 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)容,更多關(guān)于Android事件分發(fā)機制的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品va视频| 播放一区二区| 99精品网站| 亚洲成av人片一区二区密柚| 人在线成免费视频| 久久精品主播| 国产精品腿扒开做爽爽爽挤奶网站| 久久久天天操| 黄色av一区| 中文视频一区| 久久国产视频网| 精品一区二区男人吃奶 | 日韩和的一区二在线| 中文在线а√在线8| 丁香六月综合| 欧美日一区二区| 亚洲三级网站| 久久伊人久久| 国精品一区二区| 日本不卡高清视频| 国产一区二区三区四区五区 | 狠狠操综合网| 日产欧产美韩系列久久99| 老司机精品视频网| 激情五月综合| 亚洲一二三区视频| 麻豆91精品91久久久的内涵| 久久精品国内一区二区三区水蜜桃| 丝袜a∨在线一区二区三区不卡| 日韩高清三区| 在线看片福利| 日韩影院免费视频| 国产在线视频欧美一区| 午夜日本精品| 国产精品自在| 久久人人97超碰国产公开结果| 噜噜噜躁狠狠躁狠狠精品视频| 91精品国产自产在线丝袜啪| 亚洲美女久久精品| 中文字幕日本一区二区| 精品少妇av| 国产一区导航| 国产一区二区三区天码| 中文无码日韩欧| 91精品韩国| 日韩高清不卡在线| 99久久精品网站| 国产精品麻豆成人av电影艾秋| 日韩欧美三级| 欧美日本不卡| 亚州av乱码久久精品蜜桃| 欧美日韩一区自拍| 久久影视一区| 欧美成人精品一级| 香蕉成人久久| 成人精品久久| 亚州国产精品| 欧美日韩激情在线一区二区三区| 国产精品一卡| 视频一区在线播放| 亚洲91久久| 麻豆国产91在线播放| 亚洲久草在线| 在线亚洲精品| 久久国产免费| 成人国产精品久久| 欧美一级一区| 先锋影音国产一区| 久久国产影院| 麻豆精品久久久| 日韩中出av| 欧美1级日本1级| 欧美国产美女| 久久99久久人婷婷精品综合| 蜜桃久久久久久| 1024精品久久久久久久久| yellow在线观看网址| 国产毛片久久久| 日韩福利在线观看| 亚洲人www| 丝袜亚洲精品中文字幕一区| 韩日一区二区三区| 五月婷婷亚洲| 免费观看久久av| 91精品国产福利在线观看麻豆| 黄色精品视频| 久久精品一区二区三区中文字幕| 日韩国产在线不卡视频| 免费人成网站在线观看欧美高清| 欧美日中文字幕| 精品中文一区| 五月精品视频| 国产精品88久久久久久| 99视频精品全国免费| av亚洲一区二区三区| 久久国产欧美| 日韩精品免费一区二区在线观看 | 日韩久久一区| 欧美日韩夜夜| 日韩欧美2区| 日韩国产在线观看| 97久久亚洲| 国产欧美自拍一区| 欧美日韩视频免费看| 国产欧美日韩一级| 国产精品伦一区二区| 精品一区二区三区在线观看视频 | 天堂网av成人| 欧美~级网站不卡| 亚洲欧美视频一区二区三区| 欧美午夜不卡| 亚洲精一区二区三区| 日韩av成人高清| 国产日韩欧美一区二区三区在线观看| 国产精品一区亚洲| 欧美1区2区3| 国产成人精品亚洲线观看 | 午夜在线精品偷拍| 亚洲精品进入| 国产剧情在线观看一区| 久久尤物视频| 色偷偷偷在线视频播放| 欧产日产国产精品视频| 午夜欧美理论片| 四虎成人精品一区二区免费网站| 日韩高清三区| 91精品美女| 福利一区二区| 欧美+日本+国产+在线a∨观看| 国产视频一区欧美| 日韩精品久久久久久久软件91| 国产欧美日韩精品一区二区免费| 成人精品国产亚洲| 合欧美一区二区三区| 亚洲3区在线| 成人国产精选| 日韩亚洲在线| 亚洲丝袜美腿一区| 91亚洲无吗| 久久久一二三| 91精品尤物| 一区二区小说| 欧美在线91| 丝袜美腿一区| 亚洲人www| 国产资源在线观看入口av| 亚洲一区国产| 精品国产麻豆| 日韩一区精品视频| 麻豆视频一区二区| 国产精品日韩| 老鸭窝一区二区久久精品| 91精品国产91久久久久久黑人| 日韩精品久久久久久| 香蕉视频亚洲一级| 日韩精品久久理论片| 婷婷成人在线| 国产精品国码视频| 一本色道精品久久一区二区三区| 久久精品毛片| 亚洲一二av| 91精品一区国产高清在线gif | 国产精品成人一区二区网站软件| 成人日韩在线| 国产日韩精品视频一区二区三区| av在线日韩| 麻豆国产精品| 日韩一区二区三区免费视频 | 日本亚洲欧洲无免费码在线| 欧美日韩免费看片| 国产精品久久久久av蜜臀| 国产精品色网| 久久精选视频| 国产精品99一区二区三区| 婷婷精品在线| 99精品美女| 国产伊人久久| 国产免费av国片精品草莓男男 | 九九综合在线| 国产精品国产一区| 91嫩草精品| 亚洲一级大片| 99pao成人国产永久免费视频| 97国产成人高清在线观看| 久久精品99国产精品| 丝袜脚交一区二区| 国产高清一区二区| 久久精品主播| 国产高潮在线| 国产欧美成人| 日韩精品第一| 亚洲精品欧洲| 一区二区三区午夜视频| 国产伊人精品| 91精品推荐| 日韩国产网站| 久久精品一区二区不卡| 欧洲精品一区二区三区| 97精品国产| a日韩av网址|