2016-02-03 13 views
11

Ho un RecyclerView in cui l'utente seleziona un articolo. Al momento della selezione certa vista diventa visibile prima del testo (vedi immagine). Voglio animare il suo aspetto.Come modificare le animazioni utilizzate dal meccanismo animateLayoutChanges?

Graphical representation

animateLayoutChanges proprietà sul tracciato della voce fa il lavoro perfettamente, tranne che per il tipo di animazione per la vista aspetto - si affievolisce nel voglio che scala da 0 a 100 dimensioni%, credo si chiami '. pop-up 'animazione.

Se disattivo animateLayoutChanges e utilizzo l'animazione XML per quello, funziona, ma il testo vicino non è più animato (dovrebbe scorrere per contenere spazio per la vista e il suo margine). Si sposta all'istante a destra e viene riprodotta l'animazione. Questo è peggio con l'animazione inversa, poiché il testo si sovrappone alla vista prima che scompaia.

Quindi ho bisogno di combinare il meccanismo di default e la mia animazione in qualche modo. Quale sarebbe il modo più semplice per farlo senza approfondire le animazioni personalizzate?

risposta

21

Dopo aver scavato molto nei posti sbagliati, ho trovato la risposta da solo. Potrebbe aiutare qualcuno.

animateLayoutChanges proprietà se abilitato utilizza un'istanza di LayoutTransition per fare il suo lavoro in ViewGroup.

Quindi, al fine di modificare le animazioni, è possibile creare un'istanza di LayoutTransition, impostare Animator per la transizione che si desidera modificare e quindi assegnare l'istanza a ViewGroup via setLayoutTransition().

Nel mio caso il risultato è:

Animator scaleDown = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 1, 0), PropertyValuesHolder.ofFloat("scaleY", 1, 0)); 
scaleDown.setDuration(300); 
scaleDown.setInterpolator(new OvershootInterpolator()); 

Animator scaleUp = ObjectAnimator.ofPropertyValuesHolder((Object)null, PropertyValuesHolder.ofFloat("scaleX", 0, 1), PropertyValuesHolder.ofFloat("scaleY", 0, 1)); 
scaleUp.setDuration(300); 
scaleUp.setStartDelay(300); 
scaleUp.setInterpolator(new OvershootInterpolator()); 

LayoutTransition itemLayoutTransition = new LayoutTransition(); 
itemLayoutTransition.setAnimator(LayoutTransition.APPEARING, scaleUp); 
itemLayoutTransition.setAnimator(LayoutTransition.DISAPPEARING, scaleDown); 

ViewGroup av = (ViewGroup)v.findViewById(R.id.animated_layout); 
av.setLayoutTransition(itemLayoutTransition); 

More info in LayoutTransition reference documentation.

+0

Potete per favore mostrare il codice completo per questo? Non sembra funzionare per me. –

+0

In realtà è passato un po 'di tempo dall'ultima volta che ho codificato per Android, ma sono comunque riuscito a estrarlo dai miei archivi :) se hai familiarità con RecyclerView (dalla libreria android.support.v7) questo aspetto dovrebbe aiutarti: https: //gist.github.com/mrnateriver/cd988f6ca745ebad7db7cc16581069ee non è un'implementazione completa di RecyclerView.Adapter, ma dovrebbe darti un'idea di come funzionano le animazioni personalizzate – mrnateriver

+0

Speravo in una soluzione di un layout normale (LinearLayout, ad esempio) –