滚动时浮动操作按钮消失

13

我刚刚安装了FutureSimple悬浮操作按钮库,我觉得它非常漂亮。虽然它不包含滚动时消失的逻辑,但我很喜欢它。 然而,我想实现一个快速返回模式,并寻找一种简单的方法来实现它。 基本上,我像这样设置了一个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的“官方”fab库)。

PS:我正在使用FutureSimple库,因为它具有菜单功能。

非常感谢您提前提供的帮助 :)!


你的示例代码中的"fam"是什么意思? - uberchilly
fam = 你的fab。我正在使用一个自定义库来处理FloatingActionsMenu,但在任何标准示例中,它将是一个FloatingActionButton(来自Design Support Library或只是一个ImageButton),你会称之为fab。 - Mehdi
根据lalliga的大小调整tnx。 - Setmax
3
请回答你的问题,而不是编辑问题;这个问题仍然没有答案。 - rds
好的,我会确保做到! - Mehdi
1个回答

3

几周前,我解决了我的问题,并且我觉得我应该在这里回答自己的问题 :)

经过数天的研究,我发现实现此功能的最佳方法是使用Android引入的新RecyclerView。您可以使用RecyclerView处理滚动中的小像素变化,但是使用ListView几乎永远无法做到这一点(只能处理滚动的“项目”更改)。 我已将ScrollView监听器实现到我的RecyclerView中,如下所示:

   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,而且实际上处理了一个非常完美的“滚动时操作栏消失”的效果。但是,我没有时间适应您的需求,但它确实适用于我们的情况。

回到我们的代码,在创建侦听器之后,我们可以通过实现其接口将其添加到我们的FAB中:

           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();
        }
    });

然后,就这样!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接