2015-02-28 9 views
12

Właśnie zainstalowałem bibliotekę FutureSimple dla pływających przycisków akcji i myślę, że jest po prostu piękna. Chociaż nie zawiera znikającej logiki przewijania, uwielbiam to. Chciałbym jednak wdrożyć wzór Szybki powrót i szukam prostego sposobu na zrobienie tego. Zasadniczo skonfigurować detektor ObservableListView tak:Pływające przyciski akcji znikające po przewinięciu

listView.setScrollViewCallbacks(new ObservableScrollViewCallbacks() { 
     @Override 
     public void onScrollChanged(int i, boolean b, boolean b2) { } 

     @Override 
     public void onDownMotionEvent() { } 

     @Override 
     public void onUpOrCancelMotionEvent(ScrollState scrollState) { } 
    }); 

I chcę wiedzieć, czy jest to prosty sposób, aby mój przycisk Przenieś się (z szybkim button.animate() translationY (xx)). ten słuchacz.

Tak więc, gdy przewijam w dół, znika, a następnie pojawia się ponownie, gdy przewijam w górę.

Przyjrzałem się różnym implementacjom, ale nie do końca rozumiałem ich jist (szczególnie "oficjalną" bibliotekę fab z makovkastar).

PS: Używam biblioteki FutureSimple, ponieważ ma ona menu.

Bardzo dziękuję z góry za bardzo potrzebną pomoc :)!

+0

Co to jest fam w Twoim kodzie przykładowym? – uberchilly

+0

fam = your fab. Używam niestandardowej biblioteki, która obsługuje FloatingActionsMenu, ale w dowolnym standardowym przykładzie byłaby to FloatingActionButton (z biblioteki Support Design Library lub po prostu ImageButton) i nazwałbyś ją fab. – Mehdi

+0

tnx w zależności od wielkości lalliga. – Setmax

Odpowiedz

3

mi rozwiązać mój problem kilka tygodni temu, a ja prawdopodobnie zorientowali powinienem odpowiedzieć na moje własne pytanie tutaj :)

Po kilku dniach badań, znalazłem, że najlepszym sposobem realizacji tego celu jest za pomocą nowy RecyclerView wprowadzony przez Androida. Możesz manipulować małymi zmianami w pikselach podczas przewijania z RecyclerView, ale z ListView prawie nigdy nie będziesz w stanie tego zrobić (tylko można obsłużyć zmianę "przedmiotów" przewijanych). I zostały wdrożone Scrollview Listener do mojego RecyclerView tak:

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(); 

Ten kod robi więcej niż tylko pokazać lub ukryć FAB na zwoju, to faktycznie zajmuje całkiem doskonały „pasek przewijania na działanie zniknie” efekt. Ale, nie mam czasu, aby dopasować ten kod do twoich potrzeb, ale to robi działa w naszym przypadku, tutaj.

Aby dostać się z powrotem do naszego kodu, po utworzeniu naszego słuchacza, możemy dodać go do naszych FAB wdrażając swoje interfejsy:

  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(); 
     } 
    }); 

And voila!