官方文檔中對CoordinatorLayout有以下的描述:java
CoordinatorLayout is a super-powered FrameLayout.
CoordinatorLayout is intended for two primary use cases:android
As a top-level application decor or chrome layoutchrome
As a container for a specific interaction with one or more child viewsapp
即,能夠做爲頂層佈局,或者協調子佈局的容器。ide
先看一個效果圖。當彈出snackbar以後,floatbutton的位置會相應向上提高一個snackbar的高度。而且,經過右滑操做,能夠刪除這個snackbar。這在普通的Layout容器中沒法實現。佈局
顯示SnackBar的代碼:學習
Snackbar.make(view, "Hello. I am Snackbar!", Snackbar.LENGTH_SHORT).setAction("OK", null).show();
在顯示snackbar的時候,須要傳入一個view,snackbar會從view開始向上尋找父view,直到找到一個頂級view或者CoordinatorLayout,而後顯示在這個view的底部。若是是CoordinatorLayout,則會有上述的高級效果。字體
上述的頁面佈局代碼:spa
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_margin="16dp" android:src="@drawable/ic_done" /> </android.support.design.widget.CoordinatorLayout>
Activity中的java代碼:code
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view,"FAB",Snackbar.LENGTH_LONG) .setAction("cancel", new View.OnClickListener() { @Override c void onClick() }.show(); } }); } }
首先要說明的是,老舊的ActionBar並不能與CoordinatorLayout兼容。須要使用較新的Toolbar。
先看效果圖:
(向下滑動列表時)
(向上滑動列表時)
這裏須要使用AppBarLayout講Toolbar包裹起來:
<android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <include layout="@layout/toolbar" android:id="@id/toolbar"/> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" />
注意,在比較舊的版本中,AppBarLayout必須做爲CoordinatorLayout的第一個子元素,可是如今好像能夠只做爲AppBarLayout的直接子元素就能夠了。
爲了實現向上滑動時可以隱藏Toolbar,須要在Toolbar中添加以下的屬性:app:layout_scrollFlags="scroll|enterAlways"
。
要實現滑動的高級效果,Scroll標誌是必須的。flags還有幾個取值:
scroll: 全部想滾動出屏幕的view都須要設置這個flag, 沒有設置這個flag的view將被固定在屏幕頂部。例如,TabLayout 沒有設置這個值,將會停留在屏幕頂部。
enterAlways: 設置這個flag時,向下的滾動都會致使該view變爲可見,啓用快速「返回模式」。
enterAlwaysCollapsed: 當你的視圖已經設置minHeight屬性又使用此標誌時,你的視圖只能已最小高度進入,只有當滾動視圖到達頂部時才擴大到完整高度。
exitUntilCollapsed: 滾動退出屏幕,最後摺疊在頂端。
與AppBarLayout同級,做爲CoordinatorLayout的另外一個直接子元素的則是產生滑動事件的view。這裏ListView並不兼容,可使用RecycledView。RecycledView是一個高度解耦的列表視圖,提供子視圖的回收功能。而且,佈局方式高度可定製。對控件的操做變成了面向ViewHolder的操做。
佈局文件:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_scrollFlags="scroll|enterAlways" /> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_margin="@dimen/fab_margin" android:src="@drawable/ic_done" /> </android.support.design.widget.CoordinatorLayout>
注意,列表視圖中有這樣一個屬性:app:layout_behavior="@string/appbar_scrolling_view_behavior"
,這個屬性告訴CoordinateLayout,我但願個人滑動操做可以引發Toolbar的變化。CoordinatorLayout就會去檢查Toolbar的scrollFlags,並在滑動時做出相應的調整。
同時,這個屬性還可讓下方的視圖頂端保持在Toolbar的下方,而不是被Toolbar覆蓋。
這時候,須要在AppBarLayout中將Toolbar用CollapsingToolbarLayout再包裹起來:
<android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="48dp" app:expandedTitleMarginEnd="64dp"> <include layout="@layout/toolbar" android:id="@+id/toolbar"/> </android.support.design.widget.CollapsingToolbarLayout>
這種效果在詳情頁面用的較多,展現個性化內容,圖像有強烈的吸引力。這個效果重點使用了CollapsingToolbarLayout 。
CollapsingToolbarLayout可實現Toolbar的摺疊效果。CollapsingToolbarLayout的子視圖相似與LinearLayout垂直方向排放。
CollapsingToolbarLayout 提供如下屬性和方法是用:
Collapsing title:ToolBar的標題,當CollapsingToolbarLayout全屏沒有摺疊時,title顯示的是大字體,在摺疊的過程當中,title不斷變小到必定大小的效果。你能夠調用setTitle(CharSequence)方法設置title。
Content scrim:ToolBar被摺疊到頂部固定時候的背景,你能夠調用setContentScrim(Drawable)方法改變背景或者 在屬性中使用 app:contentScrim=」?attr/colorPrimary」來改變背景。
Status bar scrim:狀態欄的背景,調用方法setStatusBarScrim(Drawable)。還沒研究明白,不過這個只能在Android5.0以上系統有效果。
Parallax scrolling children:CollapsingToolbarLayout滑動時,子視圖的視覺差,能夠經過屬性app:layout_collapseParallaxMultiplier=」0.6」改變。值de的範圍[0.0,1.0],值越大視察越大。
CollapseMode :子視圖的摺疊模式,在子視圖設置,有兩種「pin」:固定模式,在摺疊的時候最後固定在頂端;「parallax」:視差模式,在摺疊的時候會有個視差摺疊的效果。咱們能夠在佈局中使用屬性app:layout_collapseMode=」parallax」來改變。
CoordinatorLayout 還提供了一個 layout_anchor 的屬性,連同 layout_anchorGravity 一塊兒,能夠用來放置與其餘視圖關聯在一塊兒的懸浮視圖(如 FloatingActionButton)。本例中使用FloatingActionButton。
經過下面的參數設置了FloatingActionButton的位置,兩個屬性共同做用使得FAB 浮動按鈕也能摺疊消失,展示。
app:layout_anchor="@id/appbar"
app:layout_anchorGravity="bottom|right|end"
使用CollapsingToolbarLayout實現摺疊效果,須要注意3點
AppBarLayout的高度固定
CollapsingToolbarLayout的子視圖設置layout_collapseMode屬性
關聯懸浮視圖設置app:layout_anchor,app:layout_anchorGravity屬性
(佔坑,挖坑學習中)