13

Floating Action Buttons 用の 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 の「公式」fab ライブラリ)。

PS : メニューがあるため、FutureSimple ライブラリを使用しています。

事前に、あなたの切望された助けをどうもありがとう:) !

4

1 に答える 1

3

私は数週間前に自分の問題を解決しましたが、おそらくここで自分の質問に答える必要があると思いました:)

数日間の調査の結果、これを実装する最良の方法は、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();
        }
    });

そしてほら!

于 2016-01-01T21:27:06.073 に答える