我想要达到类似的效果,您可以在Google Play商店中看到类似的效果,其中滚动内容Toolbar
在您滚动时不在屏幕上。在#io15推出,但是CoordinatorLayout:隐藏/显示半可见工具栏?
也能正常工作与CoordinatorLayout
(1):如果停止滚动“中途”工具栏仍然在屏幕上,但减少了一半:我想它动画关闭就像在Google Play商店中一样。 我该如何做到这一点?
我想要达到类似的效果,您可以在Google Play商店中看到类似的效果,其中滚动内容Toolbar
在您滚动时不在屏幕上。在#io15推出,但是CoordinatorLayout:隐藏/显示半可见工具栏?
也能正常工作与CoordinatorLayout
(1):如果停止滚动“中途”工具栏仍然在屏幕上,但减少了一半:我想它动画关闭就像在Google Play商店中一样。 我该如何做到这一点?
现在Android支持库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));
从RecyclerView.OnScrollListener扩展MyScrollListerner。
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
@zoltish请让我知道这是否适用于您,并接受作为答案,如果它。 :) – nishantapatil
应用栏/工具栏可以在不滚动RecyclerView的情况下滚动,在这种情况下,监听器代码将不会被触发。这种情况发生在RecyclerView位于顶部并且无法向上滚动时,并且用户拉下来,这将导致整个CoordinatorLayout的滚动 – marmor