要实现工具栏的平滑展开和折叠,您可以应用翻译动画或将CoordinatorLayout与AppBarLayout和Toolbar一起使用。
动画:首先,您必须检测 RecyclerView 上的向上滚动和向下滚动。为此,您可以在 RecyclerView 上设置“setOnScrollListener”。向上滚动和向下滚动后,只需应用动画即可。
代码:
rvHomeList.setOnScrollListener(new RecyclerView.OnScrollListener() {
int verticalOffset;
boolean scrollingUp;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (scrollingUp) {
Log.e("onScrollStateChanged", "UP");
if (verticalOffset > llTop.getHeight()) {
toolbarAnimateHide();
}
} else {
Log.e("onScrollStateChanged", "down");
if (llTop.getTranslationY() < llTop.getHeight() * -0.6 && verticalOffset > llTop.getHeight()) {
toolbarAnimateHide();
} else {
toolbarAnimateShow(verticalOffset);
}
}
}
}
@Override
public final void onScrolled(RecyclerView recyclerView, int dx, int dy) {
verticalOffset += dy;
scrollingUp = dy > 0;
int toolbarYOffset = (int) (dy - llTop.getTranslationY());
llTop.animate().cancel();
if (scrollingUp) {
Log.e("onScrolled", "UP");
if (toolbarYOffset < llTop.getHeight()) {
llTop.setTranslationY(-toolbarYOffset);
} else {
llTop.setTranslationY(-llTop.getHeight());
}
} else {
Log.e("onScrolled", "down");
if (toolbarYOffset < 0) {
llTop.setTranslationY(0);
} else {
llTop.setTranslationY(-toolbarYOffset);
}
}
}
});
动画方法:
private void toolbarAnimateShow(final int verticalOffset) {
if (!isShowing) {
isShowing = true;
llTop.animate()
.translationY(0)
.setInterpolator(new LinearInterpolator())
.setDuration(180)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
llTop.setVisibility(View.VISIBLE);
isShowing = false;
}
});
}
}
private void toolbarAnimateHide() {
if (!isHidding) {
isHidding = true;
llTop.animate()
.translationY(-llTop.getHeight())
.setInterpolator(new LinearInterpolator())
.setDuration(180)
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
llTop.setVisibility(View.GONE);
isHidding = false;
}
});
}
}
CoordinatorLayout with AppBarLayout and Toolbar: 通过appBarLayout 和toolbar 使用coordinatorLayout,并在app:layout_scrollFlags 属性中设置滚动标志来实现滚动效果。必须启用它才能使任何滚动效果生效。此标志必须与 enterAlways、enterAlwaysCollapsed、exitUntilCollapsed 或 snap 一起启用。
-
enterAlways: 向上滚动时视图将变为可见。当从列表底部滚动并希望在向上滚动时立即显示工具栏时,此标志很有用。
-
enterAlwaysCollapsed: 通常,当只使用 enterAlways 时,工具栏会随着您向下滚动而继续展开。假设声明了 enterAlways 并且您已指定了 minHeight,您也可以指定 enterAlwaysCollapsed。使用此设置时,您的视图将仅显示在此最小高度。只有当滚动到顶部时,视图才会展开到其全高
-
exitUntilCollapsed: 设置滚动标志时,向下滚动通常会导致整个内容移动。通过指定 minHeight 和 exitUntilCollapsed,将在其余内容开始之前达到 Toolbar 的最小高度滚动并退出屏幕
-
snap: 使用此选项将确定当视图仅部分缩小时要执行的操作。如果滚动结束并且视图大小已减小到其原始大小的 50% 以下,则此视图返回其原始大小。如果大小大于其大小的 50%,它将完全消失。
代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/llBase"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbarContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/_40sdp"
android:gravity="center"
android:theme="@style/ThemeOverlay.AppCompat.Light"
app:layout_scrollFlags="scroll|enterAlways">
<include
layout="@layout/top_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<RelativeLayout
android:id="@+id/rlMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
</RelativeLayout>
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>