Kontynuujemy wpisy o Toolbarze. Ten artykuł pokarze Ci w jaki sposób można przesuwać pasek akcji wraz z przewijaniem się ekranu. Przewijany Toolbar to świetny sposób na prezentację różnych rzeczy na ekranie np. wyświetlanie artykułów. W tym wpisie użyjemy takich widoków jak CoordinatorLayout, AppBarrLayout oraz CollapsingToolbarLayout.
Dodanie zależności do gradle
compile 'com.android.support:design:26.0.0-alpha1'
Tworzymy layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways" />
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>Najprostszy wygląd naszej aplikacji bez większych rzeczy. Pliku z kodem Java nie ma potrzeby prezentować wystarczy dodać wsparcie dla toolbara (zobacz więcej). Jeżeli uruchomimy aplikacje i chwycimy za pasek będzie się przesuwał.
CoordinatorLayout to zaawansowany FrameLayout. Jest rodzicem i umożliwia koordynowanie zachowań swoich potomków. Zatem zmiana jednego dziecka może wywołać zmianę u innego potomka. Zachowania możemy sami zmieniać według uznania. Jeśli tego nie zmienimy to i tak są zdefiniowane domyślnie. Natomiast AppBarrLayout to nic innego jak LinearLayout na sterydach. W tym widoku możemy osadzać inne widoki np: TabLayout Warto też się przyjrzeć atrybutowi app:layout_scrollFlags. Ten atrybut przyjmuje następujące wartości:
- scroll — oznacza chowanie się Toolbara podczas przewijania.
- enterAlways — Toolbar będzie widoczny podczas przewijania w górę.
- enterAlwaysCollapsed — Toolbar wróci do swojej pierwotnej postaci dopiero jak przewiniemy do początku ekranu.
- exitUntilCollapsed — ta opcja przyda się, wtedy gdy mamy np. obraz w Toolbarze. Wraz z przewinięciem w dół, obrazek się chowa, a pasek zmienia się w standardowy wygląd.
- snap — użycie tej opcji określi, co zrobić, gdy tylko widok został częściowo zredukowany. Jeśli przewijanie się kończy, a rozmiar widoku został zmniejszony mniej niż 50% jego oryginalności, to ten widok powróci do pierwotnego rozmiaru. Jeśli rozmiar przekracza 50% jego rozmiaru, zniknie całkowicie.
Trochę może być to zagmatwane, ale najlepiej to przetestować samemu i sprawdzić. Dodajmy teraz pod paskiem (po AppBarLayout) trochę tekstu, zróbmy to w taki sposób, aby wraz z przesuwania się tekstu pasek się chował.
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/text"
/>
</android.support.v4.widget.NestedScrollView>Ważną opcją jest tutaj: app:layout_behavior=”@string/appbar_scrolling_view_behavior” wskazuje ona na to, aby nasz tekst nie chował się pod Toolbarem. Gdybyśmy tego nie dodali dalej pasek by się przesuwał, ale tekst byłby pod nim schowany, a tego chcemy uniknąć.
Oprócz NestedScrollView możemy także dodawać inne widoki np: FrameLayout lub RecyclerView.
Ulepszamy Toolbara
Ok, już wiemy jak przesuwać Toolbar, a teraz zobacz na ten layout:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
android:id="@+id/main_content"
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.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
android:id="@+id/Image"
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:src="@drawable/photo"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.7" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="scroll|snap"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>Co tu się zmieniło? Dodaliśmy CollapsingToolbarLayout — umożliwia wykonywanie bardziej zaawansowanych animacji, takich jak użycie ImageView, które wygasa w miarę zwijania. Oto efekt: (kliknij, aby zobaczyć animacje):
Oczywiście to nie koniec możliwości, do tego możemy zrobić pasek przezroczysty, który opisywałem w innym wpisie. Dla praktyki można też przetestować własne zachowania, które wspiera CoordinatorLayout. Cały projekt można zobaczyć na Github.
