自定義view原始碼分析之事件分發01
很多時候都想弄清楚view的原始碼,很多時候在自定義view的時候都是感覺到無盡的迷茫,很多時候看到炫酷的view總是心生羨慕之情,這次我來了,我自己來開始我的原始碼分析之路。
問題
人都喜歡簡單明瞭的工作流程圖,那麼我就上自己理解的流程圖,由簡單到複雜,一步步走進自定義view的心裡。
最想知道的流程是:
- 從點選螢幕開始,是怎麼樣響應我的點選事件的?
- 介面上顯示的view,又是怎麼樣呈現在我們面前的(記得有一次被面試問到: 你最常用的listview是怎麼顯示出來的?)?
懷著問題,開始開車上路。
事件分發
點選事件分發的流程:
1,螢幕感測器->Activity ->ViewGroup->View 。
外層的touch事件的呼叫順序為:
Action_Down傳遞:
dispatchTouchEvent(Activity) ->dispatchTouchEvent(ViewGroup) -> onInterceptTouchEvent(ViewGroup)->dispatchTouchEvent(View) -> onTouch(View)->onTouchEvent(View)->onClick()(View)
如果不消費:
onTouchEvent(View)->onTouchEvent(ViewGroup)->onTouchEvent(Activity)
2,原始碼大體流程
其中Activity的原始碼:
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
getWindow()返回的便是一個Window的抽象類,具體實現便是PhoneWindow類,具體跟蹤原始碼便能找到。
PhoneWindow原始碼:
@Override
public boolean superDispatchTouchEvent(MotionEvent event) {
return mDecor.superDispatchTouchEvent(event);
}
但是PhoneWindow屬於framework層了,想繼續跟蹤便需要下載原始碼檢視原始碼:老司機的檢視方法:http://blog.csdn.net/a740169405/article/details/50019273。
繼續跟蹤framework原始碼到DecorView類,這個類便最頂層的,它繼承至ViewGroup,根據遞迴,進而便順利成章的將事件分發到各個ViewGroup和View。
DecorView原始碼:
public boolean superDispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
事件分發的大體流程以及大體原始碼跟蹤到此結束,瞭解了流程,心理是不是就有個底了?分析起來應該會順暢很多了,下面就是開始ViewGroup和View的原始碼解析了。
相關文章
- Android View 事件分發原始碼分析AndroidView事件原始碼
- 自定義View以及事件分發總結View事件
- Android事件分發:從原始碼角度分析View事件分發機制Android事件原始碼View
- Android 自定義View:處理事件分發(四)AndroidView事件
- 基於原始碼分析 Android View 事件分發機制原始碼AndroidView事件
- Android自定義View之事件分發機制總結AndroidView事件
- 自定義View事件之進階篇(四)-自定義Behavior實戰View事件
- 事件分發之View事件處理事件View
- View事件分發機制分析View事件
- 【朝花夕拾】Android自定義View篇之(五)Android事件分發及傳遞機制AndroidView事件
- Android 事件分發機制原始碼解析-view層Android事件原始碼View
- Android從原始碼角度剖析View事件分發機制Android原始碼View事件
- Android自定義View之(一)View繪製流程詳解——向原始碼要答案AndroidView原始碼
- Netty原始碼分析之自定義編解碼器Netty原始碼
- 自定義View之SwitchViewView
- Android面試複習之View事件體系(原始碼分析)Android面試View事件原始碼
- Android 自定義 View 之 LeavesLoadingAndroidView
- 【朝花夕拾】Android自定義View篇之(七)Android事件分發機制(下)解決滑動衝突AndroidView事件
- ViewGroup事件分發和處理原始碼分析View事件原始碼
- vscode原始碼分析【五】事件分發機制VSCode原始碼事件
- 自定義View事件篇進階篇(二)-自定義NestedScrolling實戰View事件
- 自定義View 之 RecyclerView.ItemDecorationView
- Android自定義View之捲尺AndroidView
- element-ui - 原始碼學習 - 自定義事件UI原始碼事件
- JAVA Comparator 自定義排序 原始碼分析Java排序原始碼
- 自定義VIEWView
- Android原始碼分析之View繪製流程Android原始碼View
- Mybatis原始碼分析(七)自定義快取、分頁的實現MyBatis原始碼快取
- Android View篇之自定義驗證碼輸入框AndroidView
- Android 自定義 View 實戰之 PuzzleViewAndroidView
- Android 自定義 View 之入門篇AndroidView
- Android自定義view之emoji鍵盤AndroidView
- Android自定義View之Canvas的使用AndroidViewCanvas
- Android自定義View:View(二)AndroidView
- 【朝花夕拾】Android自定義View篇之(五)Android事件分發機制(上)三個重要方法的處理邏輯AndroidView事件
- mybaits原始碼分析--自定義外掛(七)AI原始碼
- Flutter事件分發原始碼剖析Flutter事件原始碼
- 自定義View事件之進階篇(一)-NestedScrolling(巢狀滑動)機制View事件巢狀
- Android自定義View---驗證碼AndroidView