使用Googledevise库时,如何将工具栏捕捉到视图中或视图外?

我试图达到像WhatsApp一样的效果,工具栏(当滚动时)会像磁铁一样夹入视图,或者像磁铁一样看不见。

我有我的MainActivity XML:

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

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

我怎样才能解决这个问题,因为我希望它能够突破视野或视野。

Solutions Collecting From Web of "使用Googledevise库时,如何将工具栏捕捉到视图中或视图外?"

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

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

 <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout 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="wrap_content" app:layout_scrollFlags="scroll|enterAlways|snap" /> ----- ----- 

欲了解更多信息: http : //android-developers.blogspot.in/2015/10/android-support-library-231.html

编辑:添加end_ quote到layout_scrollFlags使这个句法正确

编辑:从支持23.1.0这不再需要。 请参阅此答案 。

解决这个问题的一种可能的方法是自定义设置到您的AppBarLayoutBehavior

 <android.support.design.widget.AppBarLayout app:layout_behavior="com.myapp.AppBarLayoutSnapBehavior" android:layout_width="match_parent" android:layout_height="wrap_content"> ... 

您的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一起alignment。 我真的喜欢这样,但我不确定这就是你想要的。

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

在主要活动

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

和layout_activity_main

 <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="@dimen/detail_backdrop_height" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:fitsSystemWindows="true"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|snap" android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="48dp" app:expandedTitleMarginEnd="64dp"> <ImageView android:id="@+id/backdrop" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:fitsSystemWindows="true" app:layout_collapseMode="parallax" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_collapseMode="pin" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout>