浮动动作按钮在滚动上消失

Meh*_*hdi 13 android android-listview floating-action-button

我刚为浮动动作按钮安装了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) { }
    });
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种简单的方法可以使我的按钮移动(使用此监听器快速button.animate().translationY(xx)).

因此,每当我向下滚动时,它就会消失,然后当我向上滚动时再次出现.

我看过不同的实现,但我还不太了解它们的主旨(特别是来自makovkastar的"官方"fab库).

PS:我正在使用FutureSimple库,因为它有菜单.

非常感谢,提前,为你非常想要的帮助:)!

Meh*_*hdi 3

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

\n\n

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

\n\n
   public abstract class HidingScrollListener extends RecyclerView.OnScrollListener {\nprivate static final int HIDE_THRESHOLD = 20;\nprivate int scrolledDistance = 0;\nprivate boolean controlsVisible = true;\n\n@Override\npublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n    super.onScrolled(recyclerView, dx, dy);\n\n    int firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();\n    //show views if first item is first visible position and views are hidden\n    if (firstVisibleItem == 0) {\n        if(!controlsVisible) {\n            onShow();\n            controlsVisible = true;\n        }\n    } else {\n        if (scrolledDistance > HIDE_THRESHOLD && controlsVisible) {\n            onHide();\n            controlsVisible = false;\n            scrolledDistance = 0;\n        } else if (scrolledDistance < -HIDE_THRESHOLD && !controlsVisible) {\n            onShow();\n            controlsVisible = true;\n            scrolledDistance = 0;\n        }\n    }\n\n    if((controlsVisible && dy>0) || (!controlsVisible && dy<0)) {\n        scrolledDistance += dy;\n    }\n}\n\npublic abstract void onHide();\npublic abstract void onShow();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这段代码的作用不仅仅是在滚动时显示或隐藏 FAB,它实际上处理了非常完美的“滚动时操作栏消失”效果。但是,我没有时间让这段代码满足您的需求,但它确实可以适合我们的情况,在这里。

\n\n

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

\n\n
           recyclerView.setOnScrollListener(new HidingScrollListener() {\n        @Override\n        public void onHide() {\n                    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) fam.getLayoutParams();\n    int fabBottomMargin = lp.bottomMargin;\n    fam.animate().translationY(fam.getHeight()+fabBottomMargin).setInterpolator(new AccelerateInterpolator(2)).start();\n        }\n\n        @Override\n        public void onShow() {\n                    toolbar.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2));\n    fam.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();\n        }\n    });\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc3\xa0!

\n