2013-07-26 18 views
29

Ho implementato correttamente NavigationDrawer per la mia applicazione.Come implementare un DrawerLayout con un handle visibile

La mia app visualizza un cassetto che si apre sulla sinistra dello schermo.

Il mio problema è che ho bisogno di aggiungere un pulsante a sinistra. Quel pulsante potrebbe essere cliccato o fatto scorrere per aprire il cassetto sinistro. Quello che posso fare.

Ma il pulsante dovrebbe essere simile a è una parte del cassetto che potrebbe traboccare sullo schermo.

Ciò significa che il pulsante deve scorrere contemporaneamente mentre il cassetto si apre e si chiude.

CHIUSO STATO:

enter image description here

APERTURA DI STATO

enter image description here

Ho provato ad aggiungere il bottone nel layout del cassetto a sinistra, ma sembra non si può fare le cose appaiono al di fuori dei suoi confini, e il cassetto sarà sempre completamente nascosto quando chiuderai esso.

Ora sto provando ad aggiungerlo per aggiungere un pulsante al DrawerLayout principale e farlo allineare alla destra del cassetto sinistro ... Ma non è fortuna ... Sembra che un DrawerLayout non possa avere più di due bambini ...

Qualsiasi aiuto sarà apprezzato.

sto usando la libreria di supporto (v4)

[EDIT] E sto sostenendo livello di API 8 ... Quindi non posso usare ImageView.setTranslationX o View.OnAttachStateChangeListener

+1

Hai trovato qualche soluzione? – alicanbatur

+0

La mia risposta (accettata) è la soluzione che ho scelto. –

risposta

6

ho trovato un modo di fare abbastanza facilmente grazie alla libreria Aniqroid scritta da Mobistry (SO pseudo)

Io uso la classe SlidingTray che è una copia di Android SlidingDrawer ma consente di posizionare il cassetto in qualsiasi angolo della s creen.

ho dichiarato l'elemento tramite XML

<com.sileria.android.view.SlidingTray 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer" 
    android:layout_width="match_parent" 
    android:layout_height="270dp" 
    android:content="@+id/content" 
    android:handle="@+id/handle" > 

    <ImageView 
     android:id="@+id/handle" 
     android:layout_width="320dp" 
     android:layout_height="24dp" 
     android:background="@drawable/tray_btn" /> 

    <LinearLayout 
     android:id="@+id/content" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="fill_vertical" 
     android:orientation="vertical" > 
    </LinearLayout> 

</com.sileria.android.view.SlidingTray> 

E proprio dovuto chiamare

Kit.init(this); 

nel mio principale Activity prima di gonfiare il layout.

Ringrazio gli sviluppatori di aniqroid!

https://code.google.com/p/aniqroid/

+0

Ho un sacco di errori nel tentativo di integrare questa libreria – zest

12

E 'abbastanza difficile.

Penso che questo sia simile a ciò che viene fatto al manico del cassetto nella nuova app di Google Maps. Non fidarti della mia parola, non sono sicuro. :)

Ho scritto commutatore che rimane sul bordo della vista contenuto Activity. Quando viene trascinato il numero DrawerLayout, ho tradotto la vista sull'asse x della quantità del figlio minimo (che è la vista del contenuto di DrawerLayout meno l'ombra (se presente). Poiché l'ombra castata + vista del contenuto di DrawerLayout fornisce l'intera larghezza misurata dell'intero cassetto.

I moltiplicare rapidamente l'offset slittato e il bambino minimo e trovare la traduzione x.

[Edit: Codice è stato rimosso per migliorare la leggibilità ed è stato spostato al link riportato di seguito]

Nella vostra attività:

mDrawerToggle = new DrawerLayoutEdgeToggle(
    this, 
    mDrawerLayout, 
    R.drawable.ic_launcher, 
    R.drawable.ic_launcher, 
    Gravity.LEFT, 
    true) { 

     @Override 
     public void onDrawerClosed(View view) { 
      super.onDrawerClosed(view); //must call super 
     } 

     @Override 
     public void onDrawerOpened(View view) { 
      super.onDrawerOpened(view); //must call super 
     } 

     @Override 
     public void onDrawerSlide(View view, float slideOffset) { 
      super.onDrawerSlide(view, slideOffset); //must call super 

     } 
    }; 
mDrawerLayout.setDrawerListener(mDrawerToggle); 

creatività spinta: È possibile aggiungere più cosmetici come la distanza da ActionBar che puoi impostare come margine al manico.

Inoltre è possibile simulare l'effetto "single-zip" spostando la maniglia verso l'alto/il basso lungo sinistra/destra, semplicemente traducendo sull'asse Y. :)

Edit: sua disposizione sul mio GitHub here

Edit 2: Per coloro che non possono ottenere l'handle appaiono all'inizio basta usare mDrawerToggle.setVerticalPostionOffset(0)

+0

Grazie mille. Non sono sicuro di poter adattare la tua soluzione anche se ho bisogno di supportare il livello API 8 come ho scritto nella mia modifica. Qualche idea per quello? Lo proveremo. –

+0

@ArmelLarcier Ho lavorato per fornire anche il supporto per la versione precedente <= 11. Non ho avuto il tempo di aggiungere la libreria di animazione NineOldAndroids. Se hai tempo, sentiti libero di creare una richiesta di pull e aggiungerla. Guarda il mio github per i cambiamenti che hai chiesto. –

+0

Impossibile far funzionare correttamente questa funzione con la tua lib, l'handle non è stato visualizzato ma quando si toccano alcune parti dello schermo (non vicino al lato sinistro in cui di solito si apre il cassetto) il cassetto sembrava apparire all'improvviso. Inoltre, non volevo utilizzare slidingDrawer poiché ritengo che il widget sia molto lento. Alla fine, con solo la lib di nineoldandroids, sono riuscito a ottenere il risultato desiderato semplicemente posizionando un'altra vista accanto al cassetto e animando il valore x allo stesso ritmo con cui si muoveva il cassetto. – Jordy