Material Design – AppBarLayout & CollapsingToolbarLayout 使用

轉載請標明出處:https://rayzhangweb.wordpress.com/
本文出自:Ray_wordpress


前言:

大家好我是Ray,這次一樣繼續Material Design的元件介紹,而我們就來談談AppBarLayout & CollapsingToolbarLayout,這2個控件的使用。相信大家都看過以下的場景畫面。也就是向上滑動時圖片會跟著滑動並且逐漸透明,向下滑動時,圖片會慢慢出現,這樣的方式。

Material Design_CollapsLayout

介紹:

AppBarLayout:是一個垂直的LinearLayout,它實現了材料設計應用欄概念的許多功能,即滾動手勢。子View應該通過setScrollFlags和相關的佈局xml屬性:app:layout_scrollFlags提供他們想要的滾動行為。

CollapsingToolbarLayout:是一個ToolBar的包裝器,它實現了一個折疊應用程序欄。 它被設計為用作AppBarLayout的子View。

也就是說如果想實現摺疊效果的動畫,可以透過這2個元件搭配使用。接下會為大家講解CollapsingToolbarLayout常用的屬性以及該注意的地方。而AppBarLayout只是單純的作為根布局使用就好,並不用設置任何屬性。

AppBarLayout 子View滾動屬性(app:layout_scrollFlags):

  • scroll:視圖將以滾動事件的直接關係滾動。 如果此前的任何同級視圖沒有此標誌,則此值不起作用。

  • enterAlways:當進入(在屏幕上滾動)時,視圖將在任何向下滾動事件上滾動,而不管滾動視圖是否也滾動。 這通常被稱為“快速返回”模式。
  • enterAlwaysCollapsed:"enterAlways"的附加標誌,它將返回視圖修改為僅初始回滾到其折疊高度。 一旦滾動視圖到達它的滾動範圍的末端,此視圖的剩餘部分將被滾動到視圖。 折疊高度由視圖的最小高度定義。
  • exitUntilCollapsed:退出時(滾動屏幕),視圖將滾動,直到它“折疊”。 折疊高度由視圖的最小高度定義。
  • snap:當滾動結束時,如果視圖只是部分可見,那麼它將被捕捉並滾動到它最接近的邊緣。 例如,如果視圖只顯示底部25%,則它將完全滾動到屏幕外。 相反,如果它的底部75%是可見的,那麼它將被完全滾動到視圖。

CollapsingToolbarLayout 子View 摺疊屬性(app:layout_collapseMode):

  • none:該視圖將作為正常,沒有摺疊行為。
  • parallax:視圖將以視差方式滾動。 並搭配setParallaxMultiplier(float)方法使用。
  • pin:視圖將固定到位,直到它到達CollapsingToolbarLayout的底部。

CollapsingToolbarLayout 常用屬性:

  • setTitle:設定標題文字。與toolbar使用則toolbar並不用設置。
  • setContentScrimColor:設置折疊後的背景顏色。

  • setStatusBarScrimColor:設置狀態檔的顏色。
  • setCollapsedTitleTextColor:設置折疊後的文字顏色。
  • setExpandedTitleColor:設置展開後的文字顏色。
  • setCollapsedTitleGravity:設置折疊後的文字位置。
  • setExpandedTitleGravity:設置展開後的文字位置。

還有其它的屬性可以參閱官方API     CollapsingToolbarLayout使用說明

實作範例:

  1. 設置NoActionBar的Theme。
  2. 在AndroidManifest.xml裡,將相對應的Activity改為剛設置好的NoActionBar Theme。
  3. 在xml佈局裡,加入AppBarLayout & CollapsingToolbarLayout。
  4. 在Activity裡,設置相關屬性。

 <1. 設置NoActionBar Theme>

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppNoActionBarTheme" parent="AppTheme">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>

<2. 將Activity設定為NoActionBar Theme>

<activity
    android:name=".CollapsingActivity"
    android:theme="@style/AppNoActionBarTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<3. 將AppBarLayout & CollapsingToolbarLayout 加入佈局>

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="com.rayzhang.android.materialdesign.CollapsingActivity">

    <!-- fitsSystemWindows設置為true 表示將佈局延伸至statusBar-->
    <android.support.design.widget.AppBarLayout
        android:id="@+id/mAppBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true">
        <!--layout_scrollFlags 5種方式
            1.scroll
            2.enterAlways
            3.enterAlwaysCollapsed
            4.exitUntilCollapsed
            5.snap -->
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/mCollaspLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="@android:color/holo_orange_light"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
            app:statusBarScrim="@android:color/transparent">
            <!-- collapseMode 3種方式
                 1.none
                 2.parallax 搭配layout_collapseParallaxMultiplier使用 值介於0~1之間
                 3.pin -->
            <ImageView
                android:id="@+id/mImgView"
                android:layout_width="match_parent"
                android:layout_height="220dp"
                android:fitsSystemWindows="true"
                android:scaleType="fitXY"
                android:src="@drawable/twice_1"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.5" />
            <!-- ToolBar高度要設定 不然標題不會顯示 -->
            <android.support.v7.widget.Toolbar
                android:id="@+id/mToolBar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"></android.support.v7.widget.Toolbar>
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/mRecyView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"></android.support.v7.widget.RecyclerView>
</android.support.design.widget.CoordinatorLayout>

<4. 在Activity中 設定相關屬性>

public class CollapsingActivity extends AppCompatActivity {
    /**
     * CollapsingToolbarLayout use
     */
    private CollapsingToolbarLayout mCollapsLayout;
    private Toolbar mToolBar;
    private RecyclerView mRecyView;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_collapsing);

        mCollapsLayout = (CollapsingToolbarLayout) findViewById(R.id.mCollaspLayout);
        mToolBar = (Toolbar) findViewById(R.id.mToolBar);
        setSupportActionBar(mToolBar);

        mCollapsLayout.setTitle("Collapsing");
        mCollapsLayout.setCollapsedTitleTypeface(Typeface.SERIF);
        mCollapsLayout.setCollapsedTitleTextColor(Color.WHITE);
        mCollapsLayout.setExpandedTitleTypeface(Typeface.SERIF);
        mCollapsLayout.setExpandedTitleColor(Color.TRANSPARENT);
        
        mRecyView = (RecyclerView) findViewById(R.id.mRecyView);
        mRecyView.setItemAnimator(new DefaultItemAnimator());
        mRecyView.setHasFixedSize(true);
        RecyclerView.LayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        mRecyView.setLayoutManager(manager);
        /**
         * 設置RecyclerView的Adapter
         */
        List list = new ArrayList<>();
        for (int i = 1, j = 100; i <= j; i++) {
            list.add("item:" + i);
        }
        DemoAdapter adapter = new DemoAdapter(list);
        mRecyView.setAdapter(adapter);
    }
}

最後代碼所顯示效果圖示如下:

Material Design_CollapsLayout_2.gif

Finally

  • 以上就是針對AppBarLayout & CollapsingToolbarLayout 2個元件,做個介紹如有任何疑問歡迎底下留言,或是mail給我也行,謝謝 !
  • 若有需要project的同學們,可至我的 github 下載。

發表留言