视差效果和捕捉工具栏,如 Google Play 商店应用

Parallax effect and snapping toolbar like Google Play Store app

我想创建 UI 类似 Google Play 商店应用。也就是说,它包含了这些特性:

我已经创建了布局来实现上述功能并且它工作正常,除了两件事:

  1. 工具栏在向上滚动进入时没有对齐
  2. 视差效果无效

这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinator_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/app_bar_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/green_dark"
            android:fitsSystemWindows="true">

            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsing_toolbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fitsSystemWindows="true"
                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
                app:contentScrim="@color/green_dark"
                app:statusBarScrim="@color/green_dark"
                app:titleEnabled="false">

                <ImageView
                    android:id="@+id/top_app_imageview"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:adjustViewBounds="true"
                    android:fitsSystemWindows="true"
                    android:scaleType="centerCrop"
                    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|enterAlways|snap"
                    app:layout_collapseMode="pin"
                    app:theme="@style/SearchToolbarStyle" />

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

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="10dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    </android.support.design.widget.CoordinatorLayout>


    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:elevation="6dp"
        app:headerLayout="@layout/layout_drawer_header"
        app:menu="@menu/drawer_menu" />

</android.support.v4.widget.DrawerLayout>

这是我的 gradle 的样子:

{
...
buildToolsVersion "25.0.0"
...
}

dependencies {
    ....
    compile 'com.android.support:appcompat-v7:25.1.0'
    compile 'com.android.support:recyclerview-v7:25.1.0'
    compile 'com.android.support:support-v4:25.1.0'
    compile 'com.android.support:design:25.1.0'
    compile 'com.android.support:cardview-v7:25.1.0'
   ....
}

有什么想法为什么视差效果不起作用以及如何实现捕捉工具栏?

试试这个;

在您的 Toolbar 中删除此行:

app:layout_collapseMode="pin"

只需在您的 Toolbar:

中使用它
app:layout_scrollFlags="scroll|enterAlways"

所以我们有:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:layout_scrollFlags="scroll|enterAlways"
    app:theme="@style/SearchToolbarStyle" />
  1. 视差效果不起作用的原因是我使用 setLayoutParams 以编程方式设置 ImageView(id:top_app_imageview)的宽度和高度。那以某种方式中断以获得正确的视差效果。解决方法是以编程方式设置 AppBarLayout 的宽度和高度,并将 Imageviewlayout_height 更改为 match_parent
  2. 我通过将 CollapsingToolbarLayoutlayout_scrollFlags 更改为 "scroll|enterAlways|enterAlwaysCollapsed|snap"
  3. 使工具栏对齐