如何在使用Google Design Library时将工具栏捕捉到视图或视图之外?

我试图实现像WhatsApp一样的效果,其中工具栏滚动时)将剪切成视图磁铁状或视图磁铁状。

我拥有的MainActivity XML:

  • DrawerLayout – 基本布局
  • CoordinatorLayout – Appbar和工具栏以及选项卡的布局
  • AppBarLayout – 用于保存工具栏和标签
  • 工具栏 – 有这个标志: app:layout_scrollFlags="scroll|enterAlways"
  • SlidingTabLayout – 显示选项卡
  • ViewPager – 用于标签
  • RecyclerView – 用于coordinatorlayout

现在不要误会我的意思,它可以工作,当我向下滚动工具栏被推出视图但说我停止中途滚动,然后工具栏只是坐在那里一半隐藏在视野外,另一半在视野中..

我怎样才能解决这个问题,因为我希望它能够跳出视图或进入视图。

此function已添加到23.1.0版本的android支持库中。 从发行说明:

通过添加SCROLL_FLAG_SNAP常量为AppBarLayout类添加了边缘捕捉支持。 滚动结束时,如果视图仅部分可见,则视图将被捕捉并滚动到其最近的边缘。

    ----- ----- 

有关更多信息: http : //android-developers.blogspot.in/2015/10/android-support-library-231.html

编辑:从支持23.1.0开始,不再需要这个。 请改为查看此答案 。

解决此问题的一种可能方法是自定义设置为AppBarLayoutBehavior

  ... 

您的AppBarLayoutSnapBehavior将通过在滚动停止时添加快照逻辑来更改AppBarLayoutSnapBehavior的默认行为。 希望下面的代码是自我解释的。

 package com.myapp; public class AppBarLayoutSnapBehavior extends AppBarLayout.Behavior { private ValueAnimator mAnimator; private boolean mNestedScrollStarted = false; public AppBarLayoutSnapBehavior(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes) { mNestedScrollStarted = super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); if (mNestedScrollStarted && mAnimator != null) { mAnimator.cancel(); } return mNestedScrollStarted; } @Override public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target) { super.onStopNestedScroll(coordinatorLayout, child, target); if (!mNestedScrollStarted) { return; } mNestedScrollStarted = false; int scrollRange = child.getTotalScrollRange(); int topOffset = getTopAndBottomOffset(); if (topOffset <= -scrollRange || topOffset >= 0) { // Already fully visible or fully invisible return; } if (topOffset < -(scrollRange / 2f)) { // Snap up (to fully invisible) animateOffsetTo(-scrollRange); } else { // Snap down (to fully visible) animateOffsetTo(0); } } private void animateOffsetTo(int offset) { if (mAnimator == null) { mAnimator = new ValueAnimator(); mAnimator.setInterpolator(new DecelerateInterpolator()); mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { setTopAndBottomOffset((int) animation.getAnimatedValue()); } }); } else { mAnimator.cancel(); } mAnimator.setIntValues(getTopAndBottomOffset(), offset); mAnimator.start(); } } 

唯一的事情是,滚动视图(在我的例子中是RecyclerView )与Toolbar一起捕捉。 我其实喜欢这种方式,但我不确定这是你想要的。

我只是隐藏了主要活动中的操作栏布局,并为CollapsingToolbarLayout设置了span。 这个对我有用。

在主要活动中

  setSupportActionBar(mToolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().hide(); CollapsingToolbarLayout collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); collapsingToolbar.setTitle("Name"); loadBackdrop(); 

和layout_activity_main