CollapsingToolbarLayout с двумя представлениями, сделайте одну прокрутку, но не другую
У меня есть активность с панелью инструментов и видом переработчика. В верхней части окна повторного просмотра у меня есть панель, которую я хочу прокручивать (чтобы перемещаться вместе со списком повторного просмотра).
Я хочу, чтобы эта панель прокручивалась за панелью инструментов, поэтому, когда прокрутка происходит, панель инструментов остается на месте, а панель скользит за ней.
Вид того, что они делают здесь:
https://i.imgur.com/fQA6bPH.gif
Но я не могу найти правильную комбинацию опций с CollapsingToolbarLayout для достижения этого эффекта:
<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:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".ui.profile.ProfileActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/profile_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/topbar_gradient"
android:theme="@style/AppTheme.Dark">
<android.support.design.widget.CollapsingToolbarLayout
android:orientation="vertical"
android:id="@+id/detail_collapsing"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@drawable/topbar_gradient"
app:layout_collapseMode="none"
android:minHeight="?android:attr/actionBarSize" />
<LinearLayout
android:layout_marginTop="?actionBarSize"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_collapseMode="none"
app:layout_collapseParallaxMultiplier="0.5">
...
</LinearLayout>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
(...)
</FrameLayout>
</android.support.design.widget.CoordinatorLayout>
Для упрощения я изменил структуру так:
<android.support.design.widget.CollapsingToolbarLayout
android:orientation="vertical"
android:id="@+id/detail_collapsing"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentScrim="?colorPrimary"
android:fitsSystemWindows="true"
app:layout_scrollFlags="scroll|enterAlways">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@drawable/topbar_gradient"
app:layout_collapseMode="pin"
android:minHeight="?android:attr/actionBarSize" />
<LinearLayout
android:layout_marginTop="?actionBarSize"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.5">
<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@drawable/bar"/>
</LinearLayout>
</android.support.design.widget.CollapsingToolbarLayout>
2 ответа
Он делает то же самое, когда мы добавляем ImageView
внутри CollapsingToolbarLayout
как это с parallax
флаг app:layout_collapseMode
:
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_scrollFlags="pin" />
<ImageView
android:src="@drawable/cheese_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
app:layout_collapseMode="parallax" //Here is the solution
android:minHeight="100dp" />
</android.support.design.widget.CollapsingToolbarLayout>
Так что вы можете добавить:
app:layout_collapseMode="parallax"
На ваш взгляд (LinearLayout
) или что-нибудь внутри.
Читайте: https://guides.codepath.com/android/handling-scrolls-with-coordinatorlayout
Я решил эту проблему, переместив панель инструментов за пределы AppBarLayout. Затем в настройках кода панели инструментов как SupportActionBar.
<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:gravity="center_horizontal"
android:orientation="vertical"
tools:context=".ui.profile.ProfileActivity">
<android.support.design.widget.AppBarLayout
android:id="@+id/profile_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/topbar_gradient"
android:theme="@style/AppTheme.Dark">
<android.support.design.widget.CollapsingToolbarLayout
android:orientation="vertical"
android:id="@+id/detail_collapsing"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
app:layout_scrollFlags="scroll|enterAlways">
<LinearLayout
android:layout_marginTop="?actionBarSize"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_collapseMode="pin">
...
</LinearLayout>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
(...)
</FrameLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@drawable/topbar_gradient"
android:minHeight="?android:attr/actionBarSize" />
</android.support.design.widget.CoordinatorLayout>
Вы должны изменить это, чтобы получить желаемый эффект:
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/detail_collapsing"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"
app:contentScrim="?colorPrimary"
app:layout_scrollFlags="scroll|enterAlwaysCollapsed|exitUntilCollapsed"
app:titleEnabled="false">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="?actionBarSize"
android:orientation="vertical"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.5">
<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@drawable/bar" />
</LinearLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@drawable/topbar_gradient"
android:minHeight="?android:attr/actionBarSize"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
Ваше изменение было в CollapsingToolbar
, используя эти три атрибута "scroll|enterAlwaysCollapsed|exitUntilCollapsed"
вместе изменит этот эффект.
Описание:
app:layout_collapseMode=""
атрибут используется для свертывания / закрепления дочерних представлений CollapsingToolbarLayout
,
Есть три атрибута к этому:
none
: Никаких эффектов вообще.
pin
: Закрепить этот вид на CollapsingToolbar при прокрутке.
parallax
: Скрыть вид параллельно скрытию CollapsingToolbar.
так что если у вас Toolbar
приколол к CollapsingToolbarLayout
затем добавьте это свойство pin
(который будет прокручиваться на сворачивающейся панели инструментов при прокрутке) и parallax
оживит его, пока не рухнет.
Посмотрим
Как на самом деле работает прокрутка с использованием этих 4 атрибутов в
app:layout_scrollFlags=""
scroll
: Представление будет прокручиваться в прямой связи с событиями прокрутки (необходимо, иначе любой другой атрибут не будет работать)
enterAlways
: При вводе (прокрутка на экране) вид прокручивается при любом событии прокрутки вниз, независимо от того, прокручивается ли вид прокрутки.
enterAlwaysCollapsed
: Дополнительный флаг для 'enterAlways', который изменяет возвращаемое представление, чтобы только первоначально прокрутить назад к его свернутой высоте.
exitUntilCollapsed
: При выходе (с прокруткой за пределами экрана) вид будет прокручиваться до тех пор, пока он не будет "свернут".
snap
: По окончании прокрутки, если вид виден только частично, он будет привязан и прокручен к ближайшему краю.
Узнайте больше здесь: ссылка