寶寶們悬槽,事件分發(fā)機制必須的“必”必問的“問”怀吻,好嗎!他這樣問你
說說你對事件分發(fā)機制的理解初婆?
如果觸發(fā)一個點擊事件蓬坡,都沒有消費,最后回到哪里磅叛?
分析一下觸摸屏幕后源碼流程屑咳?
上干貨!1浊佟兆龙!
說說你對事件分發(fā)機制的理解?
如果觸發(fā)一個點擊事件敲董,都沒有消費紫皇,最后回到哪里慰安?
有三個重要方法:
dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
這三個方法的關(guān)系是onInterceptTouchEvent和onTouchEvent在dispatchTouchEvent中執(zhí)行。
1.當(dāng)有一個點擊事件聪铺。最先activity會來處理化焕,然后傳遞給PhoneWindow,再傳遞給DecorView铃剔,最后傳給頂層ViewGroup撒桨。一般傳遞事件只考慮ViewGroup的onInterceptTouchEvent,因為一般情況不會重寫dispatchTouchEvent键兜。
對于根ViewGroup凤类,會先傳遞到它的dispatchTouchEvent,如果onInterceptTouchEvent返回true蝶押,表示這個ViewGroup要攔截踱蠢,那么交由它的onTouchEvent處理。如果返回false棋电,最后回到底層子View的onTouchEvent處理茎截。
2.如果子View的onTouchEvent返回true,表示這個事件就消費了赶盔,如果返回false企锌,就會傳遞到父ViewGroup的onTouchEvent處理。如果還返回false于未,就交給父View的父View撕攒,如此反復(fù)。
分析一下觸摸屏幕后源碼流程烘浦?
1.當(dāng)事件產(chǎn)生后抖坪,最先判斷的是DOWN事件。一個完整的事件以DOWN開始闷叉,UP結(jié)束擦俐。如果ViewGroup的onInterceptTouchEvent攔截,則mFirstTouchTarget!=null為false握侧,那么MOVE和UP事件記錄intercepted為true蚯瞧。
2.分析View的dispatchTouchEvent。如果看到mTouchListener不為空且onTouch返回true品擎,表示事件消費埋合。就不會執(zhí)行onTouchEvent了。所以mTouchListener優(yōu)先級高于onTouchEvent萄传。如果CLICKABLE或LONG_CLICKABLE為true甚颂,那么onTouchEvent就返回true。如果View設(shè)置了setClickListener會自動設(shè)置CLICKABLE為true。