浮动操作按钮在滚动时消失
Floating Action Buttons disappearing on scroll
我刚刚安装了用于浮动操作按钮的 FutureSimple 库,我认为它非常漂亮。虽然它不包含滚动逻辑消失,但我喜欢它。
但是,我想实现一个 Quick Return 模式,我正在寻找一种简单的方法来实现它。
基本上,我像这样设置了一个 ObservableListView 侦听器:
listView.setScrollViewCallbacks(new ObservableScrollViewCallbacks() {
@Override
public void onScrollChanged(int i, boolean b, boolean b2) { }
@Override
public void onDownMotionEvent() { }
@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) { }
});
我想知道是否有一种简单的方法可以让我的按钮移动(使用快速 button.animate().translationY(xx))这个监听器。
所以每当我向下滚动时,它就会消失,然后当我向上滚动时它会重新出现。
我看过不同的实现,但我不太理解它们的要旨(尤其是来自 makovkastar 的 "official" fab 库)。
PS : 我正在使用 FutureSimple 库,因为它有菜单。
非常感谢您的帮助:) !
几周前我解决了我的问题,我想我应该在这里回答我自己的问题:)
经过几天的研究,我发现实现这一点的最佳方法是使用 Android 引入的新 RecyclerView。您可以使用 RecyclerView 处理滚动时的小像素变化,但使用 ListView 几乎永远无法做到这一点(只能处理 "items" 滚动的变化)。
我已经像这样为我的 RecyclerView 实现了一个 ScrollView 监听器:
public abstract class HidingScrollListener extends RecyclerView.OnScrollListener {
private static final int HIDE_THRESHOLD = 20;
private int scrolledDistance = 0;
private boolean controlsVisible = true;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
//show views if first item is first visible position and views are hidden
if (firstVisibleItem == 0) {
if(!controlsVisible) {
onShow();
controlsVisible = true;
}
} else {
if (scrolledDistance > HIDE_THRESHOLD && controlsVisible) {
onHide();
controlsVisible = false;
scrolledDistance = 0;
} else if (scrolledDistance < -HIDE_THRESHOLD && !controlsVisible) {
onShow();
controlsVisible = true;
scrolledDistance = 0;
}
}
if((controlsVisible && dy>0) || (!controlsVisible && dy<0)) {
scrolledDistance += dy;
}
}
public abstract void onHide();
public abstract void onShow();
此代码不仅可以在滚动条上显示或隐藏 FAB,它还可以处理非常完美的 "action bar disappears on scrolling" 效果。 但是,我没有时间根据您的需要来调整这段代码,但它确实适用于我们这里的案例。
回到我们的代码,在创建我们的侦听器之后,我们可以通过实现它的接口将它添加到我们的 FABs 中:
recyclerView.setOnScrollListener(new HidingScrollListener() {
@Override
public void onHide() {
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) fam.getLayoutParams();
int fabBottomMargin = lp.bottomMargin;
fam.animate().translationY(fam.getHeight()+fabBottomMargin).setInterpolator(new AccelerateInterpolator(2)).start();
}
@Override
public void onShow() {
toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2));
fam.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();
}
});
然后 瞧!
我刚刚安装了用于浮动操作按钮的 FutureSimple 库,我认为它非常漂亮。虽然它不包含滚动逻辑消失,但我喜欢它。 但是,我想实现一个 Quick Return 模式,我正在寻找一种简单的方法来实现它。 基本上,我像这样设置了一个 ObservableListView 侦听器:
listView.setScrollViewCallbacks(new ObservableScrollViewCallbacks() {
@Override
public void onScrollChanged(int i, boolean b, boolean b2) { }
@Override
public void onDownMotionEvent() { }
@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) { }
});
我想知道是否有一种简单的方法可以让我的按钮移动(使用快速 button.animate().translationY(xx))这个监听器。
所以每当我向下滚动时,它就会消失,然后当我向上滚动时它会重新出现。
我看过不同的实现,但我不太理解它们的要旨(尤其是来自 makovkastar 的 "official" fab 库)。
PS : 我正在使用 FutureSimple 库,因为它有菜单。
非常感谢您的帮助:) !
几周前我解决了我的问题,我想我应该在这里回答我自己的问题:)
经过几天的研究,我发现实现这一点的最佳方法是使用 Android 引入的新 RecyclerView。您可以使用 RecyclerView 处理滚动时的小像素变化,但使用 ListView 几乎永远无法做到这一点(只能处理 "items" 滚动的变化)。 我已经像这样为我的 RecyclerView 实现了一个 ScrollView 监听器:
public abstract class HidingScrollListener extends RecyclerView.OnScrollListener {
private static final int HIDE_THRESHOLD = 20;
private int scrolledDistance = 0;
private boolean controlsVisible = true;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
//show views if first item is first visible position and views are hidden
if (firstVisibleItem == 0) {
if(!controlsVisible) {
onShow();
controlsVisible = true;
}
} else {
if (scrolledDistance > HIDE_THRESHOLD && controlsVisible) {
onHide();
controlsVisible = false;
scrolledDistance = 0;
} else if (scrolledDistance < -HIDE_THRESHOLD && !controlsVisible) {
onShow();
controlsVisible = true;
scrolledDistance = 0;
}
}
if((controlsVisible && dy>0) || (!controlsVisible && dy<0)) {
scrolledDistance += dy;
}
}
public abstract void onHide();
public abstract void onShow();
此代码不仅可以在滚动条上显示或隐藏 FAB,它还可以处理非常完美的 "action bar disappears on scrolling" 效果。 但是,我没有时间根据您的需要来调整这段代码,但它确实适用于我们这里的案例。
回到我们的代码,在创建我们的侦听器之后,我们可以通过实现它的接口将它添加到我们的 FABs 中:
recyclerView.setOnScrollListener(new HidingScrollListener() {
@Override
public void onHide() {
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) fam.getLayoutParams();
int fabBottomMargin = lp.bottomMargin;
fam.animate().translationY(fam.getHeight()+fabBottomMargin).setInterpolator(new AccelerateInterpolator(2)).start();
}
@Override
public void onShow() {
toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2));
fam.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();
}
});
然后 瞧!