エンジニア

Coordinator LayoutでかっこいいToolbarにする

投稿日:2016年1月31日 更新日:

エンジニアブログ担当の佐藤です。
今回紹介するのはCoordinator Layoutという機能です。またまたMaterial Designです。

Coordinator Layoutというのは子Viewの大きさや位置を動的に管理する機能です。
最近よく見かけるスクロールするとヘッダーが縮小されてToolbarに収まるレイアウトが実現できます。

こちらもまたDesign Support Libraryから使えるのでレイアウトのxmlを設定するだけで簡単に実装できます。

実装

activity_main.xml

<?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:fitsSystemWindows="true">

   <!-- ツールバー部分 -->
    <android.support.design.widget.AppBarLayout  
        android:id="@+id/appbar"  
        android:layout_width="match_parent"  
        android:layout_height="200dp"  
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"  
        android:fitsSystemWindows="true">

        <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="@color/scrim_color"  
            app:expandedTitleMarginStart="48dp"  
            app:expandedTitleMarginEnd="64dp">
            <!-- ヘッダー画像 -->
            <ImageView  
                android:layout_width="match_parent"  
                android:layout_height="match_parent"  
                android:scaleType="centerCrop"  
                android:src="@drawable/img"  
                app:layout_collapseMode="parallax"/>

            <android.support.v7.widget.Toolbar  
                android:id="@+id/toolbar"  
                android:layout_width="match_parent"  
                android:layout_height="?attr/actionBarSize"  
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"  
                app:layout_collapseMode="pin"/>

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <!-- ここからスクロールコンテンツ -->
    <android.support.v4.widget.NestedScrollView  
        android:id="@+id/nestedScrollView"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:padding="10dp"  
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <!-- ここコンテンツ -->
    </android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

レイアウトの設定説明です。

・android.support.design.widget.AppBarLayout
    android:layout_heightでヘッダーコンテンツの高さが決まります。

・android.support.design.widget.CollapsingToolbarLayout
    このViewで囲んだ内容がヘッダーになります。
    app:contentScrimで指定した色がツールバーに収まった時のツールバーの色になります。
    app:layout_scrollFlagsにスクロール時の設定ができます。
    今回設定したのは以下のフラグです
    scroll・・・画面からスクロールオフするフラグです。
    enterAlways・・・下方向へスクロールしたときにビューが表示されます。

・ImageView
    ヘッダーに今回表示するViewです。
    今回はImageViewですが、TextViewやImageButtonなどなんでも入ります。
    app:layout_collapseMode="parallax"はparallaxエフェクト(視差効果)をつけることができます。

・android.support.v7.widget.Toolbar
    スクロールして収まるToolbarです。
    こちらにはapp:layout_collapseMode="pin"と指定しています。
    pinを指定すると縮小されても画面のトップに留めることができます。

・android.support.v4.widget.NestedScrollView
    このViewで囲んだ内容がスクロールコンテンツになります。
    SupportLibrary v22.2ではRecyclerViewかNestedScrollViewのどちらかじゃないとダメみたいです。

レイアウトの説明は以上です!
設定する項目は少し多いですが、これだけでCoordinator Layoutの実装は終了です。

おまけ

Toolbarのタイトル文字の設定と文字色の設定

レイアウトを設定して実際に動かしてみるとToolbarに文字が出ない!ということがありました。
Toolbarに文字を設定するときはJavaから設定しないとうまく表示されませんでした...。

MainActivity.java

import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.CollapsingToolbarLayout;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        CollapsingToolbarLayout toolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
        // タイトル文字設定  
        toolbarLayout.setTitle("タイトル");
        // 文字色(縮小時)  
        toolbarLayout.setCollapsedTitleTextColor(文字色(縮小時));
        // 文字色(展開時)  
        toolbarLayout.setExpandedTitleColor(文字色(展開時));

        }
    }

}

Toolbarタイトル文字はToolbarの方ではなく、CollapsingToolbarLayoutから設定します。
また、setCollapsedTitleTextColor()で縮小時のタイトル文字色、setExpandedTitleColor()で展開時のタイトル文字色もそれぞれ設定できるようです。

タイトル設定だけjavaから設定するのは少し面倒ですが、Coordinator Layoutを使えばMaterial Design感がすごく出るので是非活用していきたいです!

採用情報

ワンダープラネットでは、一緒に働く仲間を幅広い職種で募集しております。

-エンジニア
-,

© WonderPlanet Inc.