私は数週間前に自分の問題を解決しましたが、おそらくここで自分の質問に答える必要があると思いました:)
数日間の調査の結果、これを実装する最良の方法は、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();
}
});
そしてほら!