Material Design開發之旅 源碼篇

上面介紹了MD一些常用控件使用,那他的任何實現這些酷炫的動畫呢?那就需要我們從源碼層看看他的工作流程,今天看源碼的主線是看看NestedScrollView和CoordinatorLayout的 ,對觸摸事件處理的工作流程。

//首先我們點擊NestedScrollView源碼,他繼承FrameLayout實現NestedScrollingParent2, NestedScrollingChild2, ScrollingView;

當我們滑動NestedScrollView時根據觸摸事件分發首先調用攔截方法onInterceptTounchEvent方法,如果對按時事件分發不瞭解可以看我這篇文章https://blog.csdn.net/qq_36237165/article/details/103046990

當我們手中按下時action是0,源碼調用了startNestedScroll方法,點擊這個方法進去看看

我們點擊這個方法看看最後調用NestedScrollingChildHelper的startNestedScroll方法,點擊這個方法進去看看

//我們看到上面這個方法,獲取父類,同時把滑動事件封裝ViewParentCompat類的onNestedScrollAccepted方法裏面,我們點擊

這個方法裏面看看

 

 

這個方法調用了父類的onNestedScrollAccepted方法並且把滑動事件也傳遞過去了。那他的父類是誰呢?那肯定是coordinatorLayout,那我們打開coordinatorLayout源碼找到onNestedScrollAccepted方法看看。

 

裏就調用了自己的onNestedScrollAccepted方法,

 

 

//我們可以看到這個方法 就是遍歷所有子view ,通過子view屬性獲取behavior的全類名創建behavior,看源碼多的小夥伴估計猜到他是通過什麼方法創建behavior了,對就是反射。  把滑動事件傳遞給了Behavior的onNestedScrollAccepted方法。

爲了驗證我們的猜測可以跟蹤源碼到如下

 

//通過反射創建雙參構造方法的實例。這也驗證了behavior爲什麼必須實現雙參構造方法。

,通過NestedScrollview的按下事件流程我們就可以知道他們的其他事件其實也是按這個流程他事件傳遞給behavior的。

//總結:當nestedScrollview開始滑動時,他會告訴coordinatorLayout你是否需要知道我們的滑動事件,當需要是,他就會把所有滑動事件告訴coordinatorLayout,coordinatorLayout就會變量子view解析子view屬性,是否設置layout_behavior屬性,如果設置了就通過反射創建behavior實例,調用layoutDependsOn判斷那個子view是被觀察者,(設置behavior的是觀察者),當被觀察者的位置大小發生改變及會調用onDendentViewChanged方法,這個方法實現觀察者的動畫效果代碼。

//這時可能有些小夥伴會好奇,nestedScrollview是如何跟CoordinatorLayout實現通信的,我們點擊源碼進去發現,他們都實現了nestedScrollingParent2接口,我們點擊接口發現接口裏面什麼也沒做,NestedScrollingParentHelper事接口的代理類,這纔是真正做事的類。細心的你還會發現有個nestedscrollingChild2類,其實這個兩個類是對觸摸事件一個向上傳遞(父類傳遞),一個向下傳遞(子類傳遞),

 

//下面我們根據源碼原理,我自定義一個coordinatorLayout和behavior。

感興趣的可以下載源碼看看,整個流程就更加清晰

https://github.com/zhudaihao/MaterialDesign

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章