Android 从顶部设置AppBarLayout动画

Android 从顶部设置AppBarLayout动画,android,android-coordinatorlayout,android-appbarlayout,Android,Android Coordinatorlayout,Android Appbarlayout,我正在尝试从顶部设置AppBarLayout的动画,就像视频中的工具栏一样 这是我的布局 <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:

我正在尝试从顶部设置AppBarLayout的动画,就像视频中的工具栏一样

这是我的布局

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/abl"
        android:layout_width="match_parent"
        android:layout_height="152dp">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?colorPrimary"
            app:titleEnabled="true"
            app:expandedTitleTextAppearance="@style/Title.Expanded"
            app:collapsedTitleTextAppearance="@style/Title.collapsed"
            app:title="Title"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

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

            </android.support.v7.widget.Toolbar>

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

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

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:behavior_overlapTop="48dp"/>

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

我计划将AppBarLayout转换为其高度的负数,然后将其设置为
0

但是由于某种原因,
abl.setTranslationY(-height)
不起作用:(

编辑:如果在布局所有视图后执行该命令(例如,如果在按钮的单击侦听器中执行,则该命令有效),但在
onCreate
onResume
onCreateOptions
中不起作用

编辑2:我需要在活动开始时没有appBarLayout,然后从顶部进入。请参阅视频。

使用以下方法:

private static final float APPBAR_ELEVATION = 14f;

private void AnimateAppBar(final AppBarLayout appBar) {
    appBar.animate()
            .translationY(-appBar.getHeight())
            .setInterpolator(new LinearInterpolator())
            .setDuration(500)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    appBar.setElevation(0);
                    appBar.animate()
                            .translationY(0)
                            .setInterpolator(new LinearInterpolator())
                            .setDuration(500)
                            .setListener(new AnimatorListenerAdapter() {
                                @Override
                                public void onAnimationEnd(Animator animation) {
                                    appBar.setElevation(APPBAR_ELEVATION);
                                }
                            });
                }
            });
}
这是调用
AnimateAppBar(appBar);

您可以同时更改
Duration
以加快动画速度,如果不想在动画结束时将效果设置为较高,则可以将
APPBAR\u ELEVATION
设置为0

编辑:

onCreate()中使用此选项

并添加此方法:

private void animationAppBarDown(final AppBarLayout appBar){
    new CountDownTimer(300, 1) {
        public void onTick(long millisUntilFinished) {
            appBar.setTranslationY(-appBar.getHeight());
        }

        public void onFinish() {
            appBar.animate()
                    .translationY(0)
                    .setDuration(500).start();
        }
    }.start();
}
结果是:

使用以下方法:

private static final float APPBAR_ELEVATION = 14f;

private void AnimateAppBar(final AppBarLayout appBar) {
    appBar.animate()
            .translationY(-appBar.getHeight())
            .setInterpolator(new LinearInterpolator())
            .setDuration(500)
            .setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    appBar.setElevation(0);
                    appBar.animate()
                            .translationY(0)
                            .setInterpolator(new LinearInterpolator())
                            .setDuration(500)
                            .setListener(new AnimatorListenerAdapter() {
                                @Override
                                public void onAnimationEnd(Animator animation) {
                                    appBar.setElevation(APPBAR_ELEVATION);
                                }
                            });
                }
            });
}
这是调用
AnimateAppBar(appBar);

您可以同时更改
Duration
以加快动画速度,如果不想在动画结束时将效果设置为较高,则可以将
APPBAR\u ELEVATION
设置为0

编辑:

onCreate()中使用此选项

并添加此方法:

private void animationAppBarDown(final AppBarLayout appBar){
    new CountDownTimer(300, 1) {
        public void onTick(long millisUntilFinished) {
            appBar.setTranslationY(-appBar.getHeight());
        }

        public void onFinish() {
            appBar.animate()
                    .translationY(0)
                    .setDuration(500).start();
        }
    }.start();
}
结果是:


我不只是想给工具栏设置动画,我想让整个appBarLayout从顶部进入。你应该有更好的代码风格。我只是说。是的,我知道@NikolaDespotoski,但这是我当时想到的第一个解决方案。@MicheleLacorte我不反对这个解决方案,但你编写的代码的风格。:)有无数种方法可以编写相同的20行代码,如果您不喜欢,我可以更改;)@NikolaDespotoski我不只是想给工具栏设置动画,我想让整个appBarLayout从顶部进入你应该有更好的代码风格。只是说说而已。是的,我知道@NikolaDespotoski,但这是我当时想到的第一个解决方案。@MicheleLacorte我不反对这个解决方案,但反对你编写的代码的样式。:)有无数种方法可以编写相同的20行代码,如果您不喜欢,我可以更改;)@尼古拉·德斯波托斯基