2013-04-08 28 views
40

Ho una GridView di layout che possono essere aggiunti o rimossi dinamicamente alla griglia.Android: animazione delle modifiche al contenuto GridView

In iOS, il comportamento nativo per gli elementi di GridView è che gli altri elementi della griglia scorrano verso il punto dell'elemento rimosso o si spostino per fare spazio quando viene aggiunto un nuovo elemento.

Tuttavia su Android il comportamento è solo per le modifiche all'app istantaneamente sullo schermo. Ho provato ad aggiungere animazioni personalizzate per ogni chiamata GetView() utilizzando alcuni trucchi in adattatore di GridView, ma che ha finito per causare alcuni problemi visto qui:

Android GridView loading the 0 indexed item in a later index's slot when data set changes

ho provato avendo le singole viste controllare l'animazione al posto del metodo getView() dell'adattatore, ma il risultato finale era identico.

Ho anche provato ad utilizzare un GridLayoutAnimationController, come questo:

Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.grid_item_fadein); 
GridLayoutAnimationController controller = new GridLayoutAnimationController(animation, .2f, .2f); 
mGrid.setLayoutAnimation(controller); 

Questo funziona sul carico iniziale di tutti i contenuti GridView, ma eventuali modifiche che il contenuto solo istantaneamente pop in, come invece accade per impostazione predefinita.

Mi sento come se fosse una funzionalità piuttosto semplice e ci dovrebbe essere un modo più semplice per farlo. Il meglio che ho visto dalla ricerca online è a library che anima gli elementi GridView che scambiano i posti nella griglia, ma non è quello che sto cercando (nella stessa libreria, quando rimuovi un elemento dalla griglia tramite l'eliminazione lo stesso effetto istantaneo che sto cercando di evitare si verifica).

Una risposta comune su SO ho anche visto "Guarda gli APIDemos, ci sono un sacco di esempi". Ma per quanto posso vedere, non ci sono in realtà esempi per l'animazione delle modifiche ai contenuti di GridView.

Qualsiasi aiuto è apprezzato, grazie.

+1

Che tipo di animazioni stai cercando di aggiungere? L'aggiunta della proprietà xml "animateLayoutChanges = true" fornirà alcune animazioni fluide di base praticamente a qualsiasi vista. – klmprt

+1

Questa è la prima cosa che ho provato e purtroppo non funziona. – JMRboosties

+0

May, so come fermare questa animazione. –

risposta

7

Chet Haase è uscito con un bel video su come gestire correttamente le animazioni ListView. Il concetto di base può essere applicato a GridViews. Puoi trovare il video here.

Se si sta sviluppando per API 1.0+, non sarà possibile utilizzare le funzionalità di animazione di riferimento citate nel video (ad esempio ViewPropertyAnimator) a meno che non si utilizzi NineOldAndroids.

4

Penso che per AdapterViews, LayoutTransition di ViewGroup non funzionerà. Guardando il codice sorgente, ViewGroup assicura che le animazioni di transizione di altri bambini avvengano per le chiamate a addView e removeView, ma AdapterView derivato non utilizza tali metodi, poiché si basa su un adattatore per fornire viste.

Il video di Chet Haase sopra menzionato riguarda l'animazione di una vista figlio singolo di un controllo ListView che sta scomparendo, piuttosto che l'animazione di tutte le altre viste figlio circostanti che si spostano per riempire il vuoto.

E, se io sto capendo bene, il GridLayoutAnimationController è di circa animazioni sfalsati per i bambini come si riempiono in (cioè prima volta o un Ridefinisci layout completo di tutta la lista, a partire dal vuoto), piuttosto che l'animazione in- posiziona le modifiche al layout dei bambini circostanti dopo un add o remove. così, i bambini appaiono svanendo o scivolando o ruotando dentro - sempre uno alla volta, dal primo all'ultimo.

Infine, una soluzione suggerita: se non è necessaria una vista basata su adattatore, è possibile passare a GridLayout o LinearLayout. È qui che funziona animateLayoutChanges="true" e che cosa utilizzano sempre le demo di "animazione di layout". Nota LayoutTransition richiede il minimo livello API 11. e GridLayout richiede api14.

4

Dopo aver effettuato modifiche al GridView come .Rimuovere() dovete chiamare mGrid.startLayoutAnimation();

GridView non lo farà automaticamente per voi. Devi attivarlo manualmente ;-)

Problemi correlati