準備
這是Google官方的文檔(請自備梯子)
CoordinatorLayout
CoordinatorLayout is a super-powered FrameLayout.
CoordinatorLayout is intended for two primary use cases:
1.As a top-level application decor or chrome layout
2.As a container for a specific interaction with one or more child views
總結(jié)一下就是集畅,CoordinatorLayout是加強版的FrameLayout,但并不是直接繼承,基本的布局方式跟FrameLayout是一樣的鉴嗤。
加強的點是CoordinatorLayout可以給它的child之間提供各種交互特性盛龄,簡單來說就是一個child可以根據(jù)另一個child的狀態(tài)來相應(yīng)的更新自己的狀態(tài)饰迹,大部分情況都是位置的更新。所以應(yīng)該叫協(xié)調(diào)布局余舶?啊鸭??
先看幾個Demo匿值,自己感受一下莉掂,看一下這個療效怎么樣
這里所有的代碼都已經(jīng)放在Github
開始
CoordinatorLayout主要提供了三種方式來實現(xiàn)child之間的互動:
- 通過anchor實現(xiàn)
- 通過insetEdge實現(xiàn)
- 通過Behaviors實現(xiàn)
那么我們依次來看一下這三種方式是怎么使用的
提示:TouchView是一個可以自由拖動的View
1. anchor
關(guān)鍵詞:layout_anchor和layout_anchorGravity
簡單說明:child B通過layout_anchor 設(shè)置child A為anchor,再通過layout_anchorGravity來根據(jù)需要設(shè)置屬性千扔,這樣B就可以A的位移相應(yīng)的位移了憎妙。
使用步驟:
- 先設(shè)置一個被觀察的child A的id
<com.xugter.cooridnatorlayoutstudy.other.TouchView
android:id="@+id/view_host"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="@color/colorPrimary"
app:layout_insetEdge="top" />
- 然后在另一個觀察的child B的設(shè)置兩個參數(shù),layout_anchor和layout_anchorGravity
<View
android:layout_width="80dp"
android:layout_height="80dp"
android:background="@color/colorAccent"
app:layout_anchor="@id/view_host"
app:layout_anchorGravity="bottom|end" />
效果如下曲楚,B就會隨著A的移動而跟著移動
2. insetEdge
關(guān)鍵詞:layout_insetEdge和layout_dodgeInsetEdges
簡單說明:child A 通過layout_insetEdge來設(shè)置插入CoordinatorLayout的方向厘唾,child B通過設(shè)置layout_dodgeInsetEdges來躲避來自相同方向的A,這樣就可以避免產(chǎn)生重疊龙誊。
使用步驟:
- 先在被觀察的child A中設(shè)置參數(shù)layout_insetEdge
<com.xugter.cooridnatorlayoutstudy.other.TouchView
android:id="@+id/view_host"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="@color/colorPrimary"
app:layout_insetEdge="top" />
- 在觀察的child B中設(shè)置參數(shù)layout_dodgeInsetEdges
<View
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_margin="20dp"
android:background="@android:color/black"
app:layout_dodgeInsetEdges="top" />
效果如下如上面的那個黑塊
另外介紹兩個特殊的控件跟insetEdge有關(guān)
FloatingActionButton和Snackbar
這兩個控件可以產(chǎn)生如下的交互
原因是FloatingActionButton自帶app:layout_dodgeInsetEdges="bottom"抚垃,
而Snackbar自帶app:layout_insetEdge="bottom",所以當Snackbar出現(xiàn)的時候FloatingActionButton能發(fā)生躲避行為
我們還可以自己加一個View來驗證一下Snackbar是自帶app:layout_insetEdge="bottom"
<View
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="bottom"
android:background="@android:color/holo_blue_bright"
app:layout_dodgeInsetEdges="bottom" />
這個view加入了app:layout_dodgeInsetEdges="bottom就可以產(chǎn)生和FloatingActionButton一樣的行為趟大,效果參考上面的藍塊
3. Behaviors
Behaviors的功能就強大很多鹤树,后面會重點介紹。這里先簡單介紹幾個Google官方提供的幾個使用了Behavior的控件逊朽。
便于理解我采用了最簡單的結(jié)構(gòu)罕伯,AppBarLayout+NestedScrollView,其中NestedScrollView可以由其他實現(xiàn)了NestedScrollingChild的控件代替
如下:其中我們最常用的大概就是下面這兩貨了,注意ScrollView是不可以的
- NestedScrollView
- RecyclerView
注意:一定要在NestedScrollView設(shè)置
app:layout_behavior="@string/appbar_scrolling_view_behavior"
不然達不到效果叽讳,具體原因會在以后分析Behaviors里在說明追他。
下面方便起見坟募,稱NestedScrollView為滾動View吧
AppBarLayout
AppBarLayout繼承自LinearLayout,所以基本布局方式跟LinearLayout是一樣的
主要代碼:
<android.support.design.widget.CoordinatorLayout ...>
<android.support.design.widget.AppBarLayout
...
>
<ImageView
...
app:layout_scrollFlags="scroll|enterAlways" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
...
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
使用AppBarLayout的關(guān)鍵點是邑狸,在Child里面設(shè)置屬性layout_scrollFlags
layout_scrollFlags可以設(shè)置下面這5個參數(shù)
scroll
snap
enterAlways
enterAlwaysCollapsed
exitUntilCollapsed
-
scroll
這參數(shù)是其他四個參數(shù)的基礎(chǔ)懈糯,即只有設(shè)置了這個參數(shù),其他參數(shù)才會生效单雾。相應(yīng)的Child才會對滾動view的滾動才會響應(yīng)赚哗。
app:layout_scrollFlags="scroll"
-
snap
這個參數(shù)的作用是讓Child具有吸附效果,抬手后會根據(jù)距離向上或向下滑動
app:layout_scrollFlags="scroll|snap"
-
enterAlways
這個參數(shù)的作用是滑動Child在任何位置向下滑動時都觸發(fā)該Child的向下滑動
app:layout_scrollFlags="scroll|enterAlways"
-
enterAlwaysCollapsed
這個參數(shù)是enterAlways的附加值硅堆,滾動View向下滾動(未在頂部)屿储,先顯示最小高度,然后是enterAlways的滾動效果硬萍,最后顯示最大高度。除了設(shè)置
app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
為了有最大高度需要另外設(shè)置
android:minHeight="100dp"
-
exitUntilCollapsed
這個參數(shù)表示滾動view向上滾動時围详,保留最小高度
app:layout_scrollFlags="scroll|exitUntilCollapsed"
CollapsingToolbarLayout
CollapsingToolbarLayout繼承自FrameLayout所以布局特性和FrameLayout一樣朴乖。谷歌官方的解釋總結(jié)一下就是,帶有視差動效的toolbar助赞,是放在AppBarLayout中的一個直接子View买羞。
主要代碼:
<android.support.design.widget.CoordinatorLayout
...>
<android.support.design.widget.AppBarLayout
...>
<android.support.design.widget.CollapsingToolbarLayout
...
app:collapsedTitleTextAppearance="@style/AppTheme.TextAppearance"
app:contentScrim="@color/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
...
app:layout_collapseParallaxMultiplier="0"
app:layout_collapseMode="parallax" />
<android.support.v7.widget.Toolbar
...
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.CollapsingToolbarLayout>
<android.support.design.widget.TabLayout
.../>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
...
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
下面簡單介紹一下CollapsingToolbarLayout的幾個屬性
-
collapsedTitleTextAppearance,expandedTitleTextAppearance
這兩個可以定制標題收起和展開的字體樣式 -
contentScrim
可以設(shè)置Content scrim雹食,參數(shù)可以是color和drawable畜普,簡單來說就是收起狀態(tài)Toolbar的背景 -
layout_collapseMode
說明CollapsingToolbarLayout的child可以設(shè)置為兩種模式parallax和pin-
pin
就是簡單的固定模式 -
parallax
表示視差模式,可以根據(jù)需要搭配layout_collapseParallaxMultiplier食用群叶,layout_collapseParallaxMultiplier的數(shù)值是0~1
0表示滾動沒有視差吃挑,意思就是完全跟著下面的滾動view,1表示不動
-
pin
哦~~~谷歌文檔里還提醒街立,不要在toolbar運行時手動添加view到toolbar里面
總結(jié)
這篇文章主要講了CoordinatorLayout的特色舶衬,以及使用的幾個方法。
介紹了一下跟CoordinatorLayout配合使用的幾個控件的基本使用方法赎离。但是這樣的基本搭配很有可能無法達到開發(fā)者的需求逛犹,很多細節(jié)還是需要自己定制。要達到這樣的要求梁剔,就需要去掌握Behaviors的使用了虽画。
代碼:Github