2012-08-13 11 views
22

Ho un LinearLayout che uso come contenitore per alcuni pulsanti e viste di testo che vorrei animare l'altezza per dare un'impressione del layout che scorre verso il basso quando l'utente preme un " mostra "pulsante.Animazione dell'altezza del contenitore LinearLayout con ValueAnimator

Ho impostato LinearLayout su layout_height = "0dp" e visibility = "gone" nel mio xml. Quindi desidero impostarlo per essere visibile e qualunque altezza sia necessaria per avvolgere il contenuto. Al momento sto avendo problemi anche a livello di animazione, non importa l'altezza del contenuto del wrap.

Ecco il mio metodo per l'animazione:

private void toggle(final LinearLayout v) { 
    v.setVisibility(View.VISIBLE); 
    ValueAnimator va = ValueAnimator.ofInt(0, 300); 
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      v.getLayoutParams().height = value.intValue(); 
      v.invalidate(); 

     } 
    }); 

    va.start(); 
} 

Forse il problema è come io pongo l'altezza del LinearLayout? O sto fraintendendo la funzione di ValueAnimator? Ho guardato intorno al post del blog di Chet Haase ma non contengono esempi specifici di animazione in altezza. Né sono stato in grado di trovare e buoni esempi di come lavorare con le animazioni di altezza utilizzando API da 3.0+. Mi piacerebbe un aiuto su questo, grazie!

+0

Perché non usare solo l'animazione del layout? –

+0

Francamente non ho idea di come usarlo e ho pensato che dal momento che sto prendendo di mira solo le versioni più recenti dell'API sarebbe più semplice usare le classi più recenti ... Continuerò a cercare come farlo con LayoutAnimation, se hai un'idea su come farlo sentiti libero di postarla come soluzione migliore :) – span

+0

C'è qualche motivo per invalidare? – portfoliobuilder

risposta

57

Guardando questo post del blog: http://tech.chitgoks.com/2011/10/29/android-animation-to-expand-collapse-view-its-children/ Ho scoperto che non dovrei usare view.invalidate() per ridisegnare il layout. Dovrei usare view.requestLayout().

Così il codice diventa qualcosa di simile:

ValueAnimator va = ValueAnimator.ofInt(0, height); 
    va.setDuration(700); 
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     public void onAnimationUpdate(ValueAnimator animation) { 
      Integer value = (Integer) animation.getAnimatedValue(); 
      v.getLayoutParams().height = value.intValue(); 
      v.requestLayout(); 
     } 
    }); 

Volevo solo aggiungere una nota su come ottenere l'altezza del LinearLayout anche per rendere l'animazione dinamica. Per ottenere l'altezza tutte le viste devono essere disegnate per prime. Quindi dobbiamo ascoltare un evento che ci dice che il disegno è fatto. Questo può essere fatto dal metodo onResume() come questo (si noti che nel mio xml ho dichiarato il contenitore wrap_content per l'altezza ed è anche visibile, dal momento che voglio nasconderlo dall'inizio lo faccio dopo averlo misurato):

@Override 
    public void onResume() { 
     super.onResume(); 
     final ViewTreeObserver vto = filterContainer.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       height = filterContainer.getHeight(); 
       filterContainer.setVisibility(View.GONE); 
       filterContainer.getLayoutParams().height = 0; 
       filterContainer.requestLayout(); 
       ViewTreeObserver obs = filterContainer.getViewTreeObserver(); 
       obs.removeGlobalOnLayoutListener(this); 
      } 
     }); 
    } 
+3

Questo mi ha aiutato a capire come usare getAnimatedValue. Grazie – speedynomads

+0

Il migliore funzionamento dell'animatore di valori è che richiederà valori intermedi tra il punto iniziale e quello finale per la durata specificata e possiamo aggiornare l'altezza del layout di tale valore intermedio fino a raggiungere l'altezza della destinazione. Inoltre l'animazione è molto liscia. Grazie. –

+0

Grazie mille! La seconda parte della risposta mi aiuta molto! – Victor