CoordinatorLayout: Скрытие / отображение наполовину видимой панели инструментов?

Id нравится добиваться аналогичного эффекта, чем тот, который вы можете видеть в магазине Google Play , где, прокручивая содержимое, Toolbar выходит за пределы экрана при прокрутке.

Однако это отлично работает с CoordinatorLayout ( 1 ), представленным на # io15 , однако: если вы остановите прокрутку «в середине пути», панель инструментов останется на экране, но будет разрезана пополам: я хочу, чтобы она отображалась вне экрана, как в В магазине Google Play. Как я могу это достичь?

Solutions Collecting From Web of "CoordinatorLayout: Скрытие / отображение наполовину видимой панели инструментов?"

Теперь в Android Support Library 23.1.0 есть новый флаг прокрутки SCROLL_FLAG_SNAP который позволяет вам добиться этого эффекта.

AppBarLayout поддерживает несколько флажков прокрутки, которые влияют на реакцию просмотра детей на прокрутку (например, прокрутка экрана). Новым для этого выпуска является SCROLL_FLAG_SNAP, гарантируя, что когда прокрутка заканчивается, вид не остается частично видимым. Вместо этого он будет прокручиваться до ближайшего края, делая полностью видимым или прокручиваемым полностью с экрана.

Файл макета операции:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="?attr/actionBarSize" android:clipToPadding="false"/> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary"/> </FrameLayout> 

Теперь внутри действия, установите панель инструментов и RecyclerView. Назначить OnScrollListener для RecyclerView

  recyclerView.setOnScrollListener(new MyScrollListener(this)); 

Расширьте MyScrollListerner из RecyclerView.OnScrollListener.

 public abstract class MyScrollListener extends RecyclerView.OnScrollListener { private static final float TOOLBAR_HIDE_THRESHOLD = 10; private static final float TOOLBAR_SHOW_THRESHOLD = 70; private int mToolbarOffset = 0; private boolean mControlsVisible = true; private int mToolbarHeight; private int mTotalScrolledDistance; public MyScrollListener(Context context) { final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes( new int[]{R.attr.actionBarSize}); mToolbarHeight = (int) styledAttributes.getDimension(0, 0); styledAttributes.recycle(); return toolbarHeight; mToolbarHeight = Utils.getToolbarHeight(context); } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if(newState == RecyclerView.SCROLL_STATE_IDLE) { if(mTotalScrolledDistance < mToolbarHeight) { setVisible(); } else { if (mControlsVisible) { if (mToolbarOffset > TOOLBAR_HIDE_THRESHOLD) { setInvisible(); } else { setVisible(); } } else { if ((mToolbarHeight - mToolbarOffset) > TOOLBAR_SHOW_THRESHOLD) { setVisible(); } else { setInvisible(); } } } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); clipToolbarOffset(); onMoved(mToolbarOffset); if((mToolbarOffset <mToolbarHeight && dy>0) || (mToolbarOffset >0 && dy<0)) { mToolbarOffset += dy; } if (mTotalScrolledDistance < 0) { mTotalScrolledDistance = 0; } else { mTotalScrolledDistance += dy; } } private void clipToolbarOffset() { if(mToolbarOffset > mToolbarHeight) { mToolbarOffset = mToolbarHeight; } else if(mToolbarOffset < 0) { mToolbarOffset = 0; } } private void setVisible() { if(mToolbarOffset > 0) { onShow(); mToolbarOffset = 0; } mControlsVisible = true; } private void setInvisible() { if(mToolbarOffset < mToolbarHeight) { onHide(); mToolbarOffset = mToolbarHeight; } mControlsVisible = false; } public abstract void onMoved(int distance); public abstract void onShow(); public abstract void onHide(); } 

Превосходное решение AppBarLayout представляется лучшим решением, так как есть два возможных события прокрутки – всего CoordinatorLayout и RecyclerView / NestedScrollView

См. Этот ответ как возможный рабочий код: https://stackoverflow.com/a/32110089/819355