Плавающие кнопки действия, исчезающие в прокрутке

Я только что установил библиотеку FutureSimple для Floating Action Buttons, и я думаю, что это просто красиво. Хотя он не содержит исчезновения логики прокрутки, мне это нравится. Тем не менее, я хотел бы реализовать шаблон быстрого возврата, и я ищу простой способ сделать это. В принципе, я установил прослушиватель 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)) с этим слушателем.

Итак, всякий раз, когда я прокручиваю вниз, он исчезает, а затем появляется, когда я прокручиваю вверх.

Я посмотрел на разные реализации, но я не совсем понял их (особенно "официальную" fab-библиотеку от makovkastar).

PS: Я использую библиотеку FutureSimple, потому что у нее есть меню.

Большое вам спасибо, за вашу очень нужную помощь:)!

Ответ 1

Я решил свою проблему несколько недель назад, и я решил, что, вероятно, должен ответить на свой вопрос:)

После нескольких дней исследований я обнаружил, что лучший способ реализовать это - использовать новый RecyclerView, представленный Android. Вы можете обрабатывать небольшие изменения в пикселях с помощью прокрутки с помощью RecyclerView, но с ListView вы почти никогда не сможете этого сделать (можно обрабатывать только изменение прокрутки элементов). Я внедрил Listroll ListView для моего 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();
        }
    });

И Voilà!