DEMO https://github.com/wujianxing/Coordi.git
在我的理解里CoordinatorLayout 是一個類似FrameLayout的容器,它是實現了NestedScrollingParent 接口的父布局容器,
提到 NestedScrollingParent 就不得不說 NestedScrollingChild,其實簡單來說NestedScrollingParent與NestedScrollingChild 是一對的。他們的功能是實現父與子試圖的聯動。
關于聯動,那么就有一個叫 Behavior 的東西,,行為。。就是具體聯動的形式(實現)。
先看布局層級吧
A3AAFA79-6A06-4EEA-8865-584170833045.png
最外層 是 CoordinatorLayout ,它的直接子布局有3個
1.AppBarLayout
2.NestedScrollView
3.Toolbar
AppBarLayout
走進它的源碼一看@CoordinatorLayout.DefaultBehavior(AppBarLayout.Behavior.class) ,是的它是有一個默認的行為的。具體什么我們先不管 。
在看看 AppBarLayout 裝了什么 沒錯 CollapsingToolbarLayout。一個繼承 FrameLayout 的東西
然后 CollapsingToolbarLayout 裝了 兩個View 和一個FrameLayout .最里面FrameLayout裝了兩個View
NestedScrollView
是實現了 NestedScrollingParent, NestedScrollingChild, ScrollingView 的FrameLayout
我們給他一個行為 app:behavior_overlapTop="30dp"app:layout_behavior="@string/appbar_scrolling_view_behavior,并在里面裝一個 cardView 的容器
Toolbar 標題 我們就放一個標題
既然有滾動 那么必須了解 layout_scrollFlags;
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap
scroll
Child View 伴隨著滾動事件而滾出或滾進屏幕。注意兩點:第一點,如果使用了其他值,必定要使用這個值才能起作用;第二點:如果在這個child View前面的任何其他Child View沒有設置這個值,那么這個Child View的設置將失去作用。
enterAlways
快速返回模式。其實就是向下滾動時Scrolling View和Child View之間的滾動優先級問題。對比scroll和scroll | enterAlways設置,發生向下滾動事件時,前者優先滾動Scrolling View,后者優先滾動Child View,當優先滾動的一方已經全部滾進屏幕之后,另一方才開始滾動
enterAlwaysCollapsed
enterAlways的附加值。這里涉及到Child View的高度和最小高度,向下滾動時,Child View先向下滾動最小高度值,然后Scrolling View開始滾動,到達邊界時,Child View再向下滾動,直至顯示完全。
需要附加屬性
android:layout_height="@dimen/dp_200"android:minHeight="@dimen/dp_56
exitUntilCollapsed
這里也涉及到最小高度。發生向上滾動事件時,Child View向上滾動退出直至最小高度,然后Scrolling View開始滾動。也就是,Child View不會完全退出屏幕。
需要附加屬性
android:layout_height="@dimen/dp_200"android:minHeight="@dimen/dp_56"
snap
簡單理解,就是Child View滾動比例的一個吸附效果。也就是說,Child View不會存在局部顯示的情況,滾動Child View的部分高度,當我們松開手指時,Child View要么向上全部滾出屏幕,要么向下全部滾進屏幕,有點類似ViewPager的左右滑動。
需要附加屬性
android:layout_height="@dimen/dp_200"
這5個都是控制 AppBarLayout 與 子類滑動的屬性。。
layout_collapseMode
pin - 設置為這個模式時,當CollapsingToolbarLayout完全收縮后,Toolbar還可以保留在屏幕上。
parallax - 設置為這個模式時,在內容滾動時,CollapsingToolbarLayout中的View(比如ImageView)也可以同時滾動,實現視差滾動效果,通常和layout_collapseParallaxMultiplier(設置視差因子)搭配使用。
layout_collapseParallaxMultiplier(視差因子) - 設置視差滾動因子,值為:0~1。
NestedScrollView
NestedScrollView是一個簡單的控件,作用跟ScrollView基本沒差別,關鍵在于跟ToolBar交互產生的作用
app:layout_behavior=@string/appbar_scrolling_view_behavior
與 CollapsingToolbarLayout 中 app:layout_scrollFlags="scroll|exitUntilCollapsed"對應 ,,,,系統一旦發現NestedScrollView中有那句話,就會檢查其他控件,然后如果有上面這句對應的話,那么滑動效果就是可以實現的。就這一點來說,他的使用基本上和RecyclerView一樣 屌屌的。。
layout_anchor
anchor 錨 ,試圖綁定,綁定在一起滑動
如圖 。。
jz.gif
有問題 什么鬼 。怎么有個東西擋住了。。。 醬紫我喜歡的。。哪里是什么東西 對把它隱藏掉 他是appLayoutBar里面的東西 。。 下次隱藏吧。