Kata04 CoordinatorLayout, CollapsingToolbarLayout and Palette - mitchwongho/GDS-Material-Kata GitHub Wiki

Introduction

CoordinatorLayout is a super-powered FrameLayout in that child-view behaviours can be provided to 'coordinate' their interactive with their parent or siblings. Reference

AppBarLayout is a vertical LinearLayout which implements many of the features of Material design appbar concepts, namely scrolling gestures. Reference

CollapsingToolbarLayout is a wrapper for a Toolbar to be used as a direct child of an AppBarLayout to provide a multitude of features, for example Collapsing title, and Parallax scrolling children. Reference

Palette is a helper class to extract prominent colours from an image. Reference

Goal

The goal of this kata is to add a CoordinatorLayout, AppBarLayout and CollapsingToolbarLayout to apply the material design, in the form of a parallax collapsing toolbar. You'll also create a palette colour from the AppBar image to apply to the header and footer toolbars. [Source reference]

Exercise

Begin by adding an android.support.design.widget.CoordinatorLayout around RecyclerView in your main_activity.xml layout.

...
<!-- CoordinatorLayout -->
<android.support.design.widget.CoordinatorLayout
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true"
    android:layout_marginBottom="?attr/actionBarSize">
    <!-- RecyclerView -->
    ...
</android.support.design.widget.CoordinatorLayout>
...

Next, to replace the previously implemented header Toolbar with an AppBar, add an android.support.design.widget.AppBarLayout as the first child layout inside of the CoordinatorLayout (above the RecyclerView), that will manage the behaviour of the AppBar/Toolbar:

...
<!-- CoordinatorLayout -->
<android.support.design.widget.CoordinatorLayout
    ...
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/appbar_height">
    </android.support.design.widget.AppBarLayout>
    <!-- RecyclerView -->
    ...
</android.support.design.widget.CoordinatorLayout>
...

Now, add a CollapsingToolbarLayout as a child within the AppBarLayout that will serve as the Toolbar with a parallax scrolling effect:

...
<!-- CoordinatorLayout -->
<android.support.design.widget.CoordinatorLayout
    ...
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/appbar_height">
        <!-- Collapsing Toolbar -->
        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:theme="@style/ThemeOverlay.AppCompat.Dark"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/image"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                android:scaleType="centerCrop"
                android:src="@drawable/image"
                app:layout_collapseMode="parallax" />
            <!-- Header Toolbar -->
            <android.support.v7.widget.Toolbar
                android:id="@+id/header_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>
    <!-- RecyclerView -->
    ...
</android.support.design.widget.CoordinatorLayout>
...

Finally, generate the Palette colour for the CollapsingToolbarLayout and footer Toolbar. This is done programmatically and your MainActivity activity:

...
protected void onCreate(Bundle savedInstanceState) {
    // Generate palette
    final CollapsingToolbarLayout ctb = (CollapsingToolbarLayout)findViewById(R.id.collapsing_toolbar);
    final Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.image);
    Palette.from(bmp).generate(new Palette.PaletteAsyncListener() {
        @Override
        public void onGenerated(final Palette palette) {
            mutedColour = palette.getMutedColor(R.attr.colorPrimary);
            ctb.setContentScrimColor(mutedColour);
            footerToolbar.setBackgroundColor(mutedColour);
        }
    });
...
}