2016-03-01 27 views
8

cerco di implementare una barra di ricerca, come Google Maps app Android:elevazione della barra degli strumenti di Android durante lo scorrimento

enter image description here

Quando la vista riciclatore è nel suo stato iniziale, la barra degli strumenti non ha elevazione. Solo quando gli utenti iniziano a scorrere, l'elevazione diventa visibile. E la barra di ricerca (barra degli strumenti) non collassa mai. Ecco quello che ho cercato di replicare questo:

<android.support.design.widget.CoordinatorLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appBarLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="64dp"> 

      <!-- content --> 

     </android.support.v7.widget.Toolbar> 

    </android.support.design.widget.AppBarLayout> 

</android.support.design.widget.CoordinatorLayout> 

e qui si può vedere il risultato:

enter image description here

Quindi il problema con la mia soluzione è, che l'elevazione della barra degli strumenti è sempre visibile . Ma voglio che appaia solo quando la vista del riciclatore scorre dietro di essa. C'è qualcosa nella libreria di supporto alla progettazione che abilita questo comportamento come visto nell'app di Google Maps?

Sto usando

com.android.support:appcompat-v7:23.2.0 
com.android.support:design:23.2.0 
+0

Hai provato a utilizzare CollapsingToolbarLayout? –

risposta

13

Sia che si utilizzi un CoordinatorLayout o no, un RecyclerView.OnScrollListener sembra la strada giusta da percorrere per quanto riguarda l'elevazione è interessato. Tuttavia, dalla mia esperienza recyclerview.getChild(0).getTop() non è affidabile e dovrebbe non essere utilizzato per determinare lo stato di scorrimento. Invece, questo è ciò che funziona:

private static final int SCROLL_DIRECTION_UP = -1; 
// ... 
// Put this into your RecyclerView.OnScrollListener > onScrolled() method 
if (recyclerview.canScrollVertically(SCROLL_DIRECTION_UP) { 
    // Remove elevation 
} else { 
    // Show elevation 
} 

Assicurarsi di assegnare un LayoutManager al RecyclerView o la chiamata di canScrollVertically può causare un crash!

+1

@DanielVeihelmann grazie che risolve perfettamente il mio problema. –

3

Ho un RecyclerView nel mio frammento. Potrei ottenere un effetto simile usando il seguente codice:

Non è il modo più intelligente e puoi aspettare risposte migliori.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    // Initial Elevation 
    final Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 
    if(toolbar!= null) 
     toolbar.setElevation(0); 

    // get initial position 
    final int initialTopPosition = mRecyclerView.getTop(); 

    // Set a listener to scroll view 
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 

     @Override 
     public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
      super.onScrollStateChanged(recyclerView, newState); 
     } 

     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 

      if(toolbar!= null && mRecyclerView.getChildAt(0).getTop() < initialTopPosition) { 
       toolbar.setElevation(50); 
      } else { 
       toolbar.setElevation(0); 
      } 
     } 
    }); 
} 
+0

sembra buono, grazie. Pensi che questo non sia possibile con solo xml? –

+0

Penso che non sia possibile solo tramite XML .. DefaultBahevior per toolbar non è correlato all'elevazione (ma alla sua altezza). Anche se trovi un modo per usare CoordinatorLayout, penso che avrai bisogno di un codice ... Cercherò di ottenere lo stesso effetto usando solo CoordinatorLayout .. Condividerò appena possibile – W0rmH0le

+0

Quasi perfetto, 'canScrollVertically' è ciò che stai cercando all'interno di OnScrollListener (vedi la mia risposta). Inoltre, semplicemente restituendo se 'toolbar == null' prima di chiamare addOnScrollListener() renderebbe il tuo codice un po 'migliore IMHO. –

Problemi correlati