うきっとラボ~中卒から始めるプログラミング~

中卒のポンコツ太郎が立派なプログラマになるまでの道のり

【Android Studio】スクロールしたら隠れるアクションバーを実装してみた

初めに

今回は折りたたみ式のアプリバーをつくります!
”折り畳み式”というのは、こういうことです↓
f:id:ukiuki0518:20191208220943g:plain:h400
画面のスクロールに合わせて、アクションバーが見え隠れしていますね(^-^)

これは、前回の記事にもあった便利な「ツールバー」を使って実装できるんです(*^^)v

ツールバーって何?
という方は以下のリンクをご覧ください(/・ω・)/
ukit-labo.hateblo.jp

では、やってみましょう!

スクロールさせるコンテンツを用意

まず、スクロールさせるコンテンツを適当に作ります。
※後でインクルードするので別ファイルで作成します

<androidx.core.widget.NestedScrollView
    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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/tv_waganeko" />
</androidx.core.widget.NestedScrollView>

f:id:ukiuki0518:20191208182559p:plain

ScrollViewではなくNestedScrollViewを使わないと、うまく画面に入らなかったり
いろいろと問題が出ます。

また、属性に
app:layout_behavior="@string/appbar_scrolling_view_behavior"
を指定しておきます。


実装パターン①

f:id:ukiuki0518:20191208202840g:plain:h400

<androidx.coordinatorlayout.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"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:logo="@mipmap/ic_launcher"
            app:layout_scrollFlags="scroll|enterAlways"/>
    </com.google.android.material.appbar.AppBarLayout>

    <include layout="@layout/content_main"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setSupportActionBar(toolbar)
    }
}

ツールバーを使用するために「アクションバーの非表示」を以降すべてのコードで行っているとします

ポイント①:CoordinatorLayout

メインアクティビティではルートに「CoordinatorLayout」を使用しています。
このレイアウトは”画面部品同士の動きを調整する”という特徴があり、
子となるViewの位置や大きさなどを動的に管理できます。

今回のように、
親子関係のない画面部品同士に連動した動き*1をさせる場合は、全体をCoordinatorLayoutで囲う必要があります。

ポイント②:AppBarLayout

表示するツールバーの親要素として「AppBarLayout」を使っています。
これはアクションバー部分を連動させるための画面部品です(^-^)

AppBarLayoutはLinearLayoutを継承しており、オリエンテーションは縦になっています。
そのため、このレイアウト内の要素は縦に並べられ、それらがアクションバーの位置に配置されます。

子要素に「layout_scrollFlags」属性を付与することで、その要素をスクロールに連動させることができます。

ポイント③:Toolbar

AppBarLayoutの子要素として定義しています。
今回はこのツールバーをスクロール連動させたいので、
layout_scrollFlags」属性を指定します。
まずscrollと記述し、「」で区切った後スクロールモードを指定します

スクロールモード 上にスクロールした時 下にスクロールした時
enterAlways ツールバーがすぐに消える ツールバーがすぐに出てくる

この時注目なのは、「下にスクロールした時の動き」です。
コンテンツの上端を意識しない動きになっています。(↓こんな感じ)
・下にスクロールした途端にツールバーがニョキっと出てくる
・さらにスクロールするとツールバーが表示されたままコンテンツがスクロール
・コンテンツの上端に到達

実装パターン②

f:id:ukiuki0518:20191208220943g:plain:h400

<androidx.coordinatorlayout.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"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="200dp">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/toolbarLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|enterAlwaysCollapsed">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:logo="@mipmap/ic_launcher" />
        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

    <include layout="@layout/content_main" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setSupportActionBar(toolbar)
    }
}

ポイント①:CollapsingToolbarLayout

AppBarLayoutの子要素、Toolbarの親要素として
CollapsingToolbarLayoutを指定しています。

これはスクロール時に連動させてAppBarLayoutのサイズを変更できるレイアウト部品です。
今回はサイズ変更がわかりやすいようにAppBarLayoutの高さを固定値として設定してみました。

サイズを変更させるのはToolbarではなくCollapsingToolbarLayoutの役割です。
そのため、先ほどはToolbarに記述していたスクロールモードの設定を、
今回はここに記述する必要があります。

スクロールモード 上にスクロールした時 下にスクロールした時
enterAlwaysCollapsed ツールバーがすぐに消える スクロールの上端まで行ったときにツールバーが表示
ポイント②:Toolbar

Toolbarで「layout_collapseMode」の属性値に"pin"を指定をすると、
Toolbarは常にアクションバーの位置にとどまります。
これで上にスクロールした時に、アイコンの位置までタイトルが移動して、一緒に隠れる動きになります。
指定しないと、上にスクロールした時すぐにアイコンだけが隠れてしまいます。


実装パターン③

f:id:ukiuki0518:20191208221530g:plain:h400

<androidx.coordinatorlayout.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"
    tools:context=".MainActivity">

    <!-- 省略 -->

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/toolbarLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|enterAlwaysCollapsed">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:logo="@mipmap/ic_launcher" />
            <!-- 省略 -->

</androidx.coordinatorlayout.widget.CoordinatorLayout>

このパターンはCollapsingToolbarLayoutのスクロールモードを変更しただけです。

スクロールモード 上にスクロールした時 下にスクロールした時
exitUntilCollapsed ツールバーがすぐに消える(一部残る) スクロールの上端まで行ったときにツールバーが表示

先ほどと違い、どれだけ上にスクロールしても、縮小したツールバーが完全に隠れません。
これには、Toolbarに「app:layout_collapseMode="pin"」の指定が必要です。

まとめ

いろいろと調べていると、アプリバーに画像を指定したり、FABをおしゃれに追加したりと
イデア次第で幅広い実装が可能なようですΣ(゚Д゚)

また気になることがあったら記事にしますね~(^_^)vℚ

*1:「”テキスト部分”のスクロール」と「”ツールバー”の表示・非表示」