若是你已經很時髦的用上了AppBar
,TabLayout
,FloatActionButton
,以及Snackbar
的話,我想你多多少少確定知道CoordinatorLayout
這個東西。 它的神祕感來自於在佈局文件 (xml) 和代碼調用上徹底看不出和其餘組件任何的耦合,卻能作出一些神奇酷炫的交互效果。git
對,沒錯,今天咱們就着重講一下CoordinatorLayout
是如何工做的,或者說,是如何讓別的組件親密無間的「合做」起來的(以及,順便會打下一點點的廣告)。github
顧名思義,CoordinatorLayout
專一於把它的子View鏈接起來,使他們之間相互很好的配合。數組
那麼既然是合做,CoordinatorLayout
的職責充當了一個第三方的角色,通知各個子View之間狀態的變換,的確,它也只幹了這麼一件事,很是純潔&純粹。佈局
那麼既然有通知,必定須要媒介,總不能把子View所有改形成適合如今這種模式的模樣吧?這樣也太不OO了,這裏的介質就是Behavior
,Behavior
是CoordinatorLayout
用來和各個子View
通訊用的代理類。spa
注意箭頭的走向,CoordinatorLayout
是經過Behavior
去控制子視圖,也就表明Behavior
的數據傳導基本上是單向的。當CoordinatorLayout
須要進行measure
,layout
的時候,都會經過behavior
詢問子視圖,是否須要進行相應的操做,若是不須要,就進行默認的行爲,咱們來看下onLayoutChild
和onMeasureChild
兩個再熟悉不過的行爲。代理
能夠看@return
的說明,若是Behavior
處理了相關的操做,那麼就會覆蓋CoordinatorLayout
默認的行爲(其實它的默認行爲和FrameLayout簡直如出一轍)code
這一節簡單的說了CoordinatorLayout
如何經過Behavior
來控制子View的佈局相關的行爲,接下來咱們看看重點的交互
部分。xml
CoordinatorLayout
的功能固然不只僅是經過Behavior
來控制子視圖的佈局,控制觸摸的流程纔是大頭。對象
首先咱們知道,控制觸摸事件,通常有2個:接口
onInterceptTouchEvent.
onTouchEvent
這裏不解釋他們之間的區別,咱們看到在Behavior
中也有這麼兩個方法。
若是你的View所擁有的Behavior
處理了相關的事件,那麼接下去發到CoordinatorLayout
上的觸摸事件就會像正常流程同樣發到這個Behavior
中。
咱們終於能夠實如今不子類化
View
的狀況下,重寫它的觸摸事件啦。
這纔是重點中的重點啊!!
首先,咱們來睜大眼睛看!
好,能夠看見CoordinatorLayout
是實現了NestedScrollingParent
接口的,也就是說,要用到這個特性的話,默認不實現NestedScrollingChild
接口 (pre Lollipop) 且不調用dispatchNestedScroll
相關接口的View
靠一邊去! 【ListView
哭暈在廁所】
CoordinatorLayout
正是從NestedScrollingParent
相關的接口中,獲取到嵌套滾動相關的參數,再經過Behavior
傳到各個子View
中,包含Behavior
的View
這時候才成爲真正處理嵌套滾動的對象,消費掉一些滾動參數後,再把消費掉的數值傳回到發生觸摸事件的View
中,達到交互的目的。
consumed
這個數組能夠在View0
中獲取到,表示的意思是它的NestedScrollParent
消費了多少的滑動量,意味着它能使用的滑動量要減去數組裏的值。
這樣產生滑動的View
就經過CoordinatorLayout
和 其餘的View
的Behavior
產生了交互,咱們能夠在Behavior
中給View
生成一些位置的偏移量,達到視圖上移動的效果。
佈局依賴,這也是個很重要的東西,好比FAB
的位置須要在Snackbar
上邊,須要依賴它來操做。
主要有2個接口(用的比較少的暫時忽略):
layoutDependsOn
onLayoutDependencyChanged
第二個接口一般在onPreDraw
或者onNestedScroll
系列的回調中 最後進行調用,注意:它並非在onLayout
過程當中回調的
第一個很顯然是告訴CoordinatorLayout
,一個View是否依賴於另外一個View。
第二個是CoordinatorLayout
發現存在依賴的時候,把被依賴方
回調給依賴方
,由於這時候,layout
已經完成,咱們能夠獲取被依賴方
的全部佈局信息,根據佈局信息,使用offset
來決定依賴方的一些位置;同時在這個時候,你也能夠調用requestLayout
進行從新佈局。
好了, Guang Gao Time:
SegmentFault for Android 新版在奮力開發中,帶着對
Material Design
的執着,強勢歸來!