CoordinatorLayout的使用

官方文檔中對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的配合使用。

先看一個效果圖。當彈出snackbar以後,floatbutton的位置會相應向上提高一個snackbar的高度。而且,經過右滑操做,能夠刪除這個snackbar。這在普通的Layout容器中沒法實現。佈局

CoordinatorLayout與Snackbar

顯示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();
            }
        });
    }
}

CoordinatorLayout實現可隱藏的Toolbar

首先要說明的是,老舊的ActionBar並不能與CoordinatorLayout兼容。須要使用較新的Toolbar。
先看效果圖:
(向下滑動列表時)
clipboard.png

(向上滑動列表時)
clipboard.png

這裏須要使用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還有幾個取值:

  1. scroll: 全部想滾動出屏幕的view都須要設置這個flag, 沒有設置這個flag的view將被固定在屏幕頂部。例如,TabLayout 沒有設置這個值,將會停留在屏幕頂部。

  2. enterAlways: 設置這個flag時,向下的滾動都會致使該view變爲可見,啓用快速「返回模式」。

  3. enterAlwaysCollapsed: 當你的視圖已經設置minHeight屬性又使用此標誌時,你的視圖只能已最小高度進入,只有當滾動視圖到達頂部時才擴大到完整高度。

  4. 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覆蓋。

可摺疊的Toolbar

clipboard.png

clipboard.png

clipboard.png

這時候,須要在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 提供如下屬性和方法是用:

  1. Collapsing title:ToolBar的標題,當CollapsingToolbarLayout全屏沒有摺疊時,title顯示的是大字體,在摺疊的過程當中,title不斷變小到必定大小的效果。你能夠調用setTitle(CharSequence)方法設置title。

  2. Content scrim:ToolBar被摺疊到頂部固定時候的背景,你能夠調用setContentScrim(Drawable)方法改變背景或者 在屬性中使用 app:contentScrim=」?attr/colorPrimary」來改變背景。

  3. Status bar scrim:狀態欄的背景,調用方法setStatusBarScrim(Drawable)。還沒研究明白,不過這個只能在Android5.0以上系統有效果。

  4. Parallax scrolling children:CollapsingToolbarLayout滑動時,子視圖的視覺差,能夠經過屬性app:layout_collapseParallaxMultiplier=」0.6」改變。值de的範圍[0.0,1.0],值越大視察越大。

  5. 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點

  1. AppBarLayout的高度固定

  2. CollapsingToolbarLayout的子視圖設置layout_collapseMode屬性

  3. 關聯懸浮視圖設置app:layout_anchor,app:layout_anchorGravity屬性

自定義behavior

(佔坑,挖坑學習中)

相關文章
相關標籤/搜索