【问题标题】:Floating Action Buttons disappearing on scroll浮动操作按钮在滚动时消失
【发布时间】:2015-02-28 16:21:56
【问题描述】:

我刚刚为浮动操作按钮安装了 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 的“官方”晶圆厂库)。

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

非常感谢您,提前,您非常需要的帮助:)!

【问题讨论】:

  • 您的示例代码中的 fam 是什么?
  • fam = 你的工厂。我正在使用一个处理 FloatingActionsMenu 的自定义库,但在任何标准示例中,它都是 FloatingActionButton(来自设计支持库或只是一个 ImageButton),您可以将其称为 fab。
  • tnx 根据 lalliga 的大小。
  • 请回答您的问题,而不是编辑问题;这个问题还是没有答案。
  • 好的,我一定会这样做的!

标签: android android-listview floating-action-button


【解决方案1】:

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

经过几天的研究,我发现实现这一点的最佳方法是使用 Android 引入的新 RecyclerView。您可以使用 RecyclerView 处理滚动中的小像素变化,但使用 ListView 您几乎永远无法做到这一点(只能处理滚动的“项目”的变化)。 我已经为我的 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,它实际上处理了一个非常完美的“操作栏在滚动时消失”效果。 但是,我没有时间根据您的需要调整此代码,但它确实适用于我们的案例,在这里。

回到我们的代码,在创建我们的监听器之后,我们可以通过实现它的接口将它添加到我们的 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();
        }
    });

还有瞧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    相关资源
    最近更新 更多