2013-02-03 11 views
5

Senza entrare troppo nel dettaglio, voglio essere in grado di "far scorrere" elementi in un ListView simile alla funzione "diapositiva per archiviare" in GMail. Sto bene con onTouchListener e tutto ciò, la mia domanda riguarda l'animazione della diapositiva.android - Slide ListView con setX, setPadding o interpolazione dell'animazione?

Le prime due cose che vengono in mente sono ..

view.setPadding(slideOffset, 0, 0, 0); 

e ..

view.setX(slideOffset); 

Il primo è molto burrosa, anche l'emulatore.
Quest'ultimo è un po 'janky sul mio Galaxy Nexus.

Le mie domande:
* Indipendentemente da quello che ho provato, qual è il modo corretto di fare questo?
Perché lo setX è meno fluido di setPadding?
Un approccio è conforme alle best practice Android più dell'altra?
Le animazioni di traduzione interpolate sono un'opzione? Se sì, puoi fornire un breve esempio per indicarmi la direzione giusta per favore?

Edit:
Per essere chiari, vi allego un'immagine dell'effetto che sto cercando di emulare.

enter image description here

+0

Ho intenzione di lasciar correre la taglia su questo. Non sono sicuro che questo problema non abbia una buona risposta o se semplicemente non stia facendo la domanda giusta. Forse una soluzione elegante si presenterà nel tempo. –

risposta

1

Sono abbastanza sicuro che il setX() è più lenta perché colpisce i suoi genitori. Quando si modifica la X di una vista, viene chiamato onLayout/onMeasure del genitore ogni volta che si aggiorna il valore. Questo perché il valore X del bambino può causare il movimento di altri elementi sul genitore, quindi il genitore deve ridisegnarsi.

È possibile verificarlo facilmente estendendo il ViewGroup e scrivendo sul registro su tali metodi. Quindi, puoi utilizzare entrambi gli approcci, il riempimento e il setX, e vedere cosa succede.

Stai cercando di animare l'articolo? O vuoi che l'utente lo sposti come su Gmail? Puoi utilizzare ObjectAnimator per gestire il valore "X" del tuo articolo. Combinato con un "livello hardware" per il tuo articolo, creerà un'esperienza più fluida. Puoi trovare maggiori dettagli su come farlo qui: http://developer.android.com/guide/topics/graphics/hardware-accel.html

+0

Ciò sembra avere molto senso per le chiamate onLayout/onMeasure. Ci sarebbe un modo per aggirare questo o sarebbe questo un motivo per usare il padding? O è solo un trucco? Preferirei che l'elemento seguisse il dito dell'utente, quindi non è necessaria alcuna animazione. ObjectAnimator è appropriato se la posizione di destinazione è in continua evoluzione, ad esempio nel seguire una posizione di tocco? –

+0

In tal caso, l'animazione non è l'approccio giusto. Puoi ancora provare a creare un "livello hardware" per l'elemento, che potrebbe rendere più facile disegnare la GPU mentre la sposti. Non dimenticare di rimuovere lo strato dopo averlo fatto. Raccontaci come è andata. – Udinic

1

Sì, se stai puntando a API superiori, ViewPropertyAnimator è probabilmente un'ottima soluzione. Se si dispone di supportare le API di basso, il mio processo di pensiero per l'implementazione sarebbe (e non ho implementato questo io personalmente, ma questo dovrebbe essere buono per le prestazioni) a:

  1. Nel vostro gestore di tocco, una volta che si ho determinato che l'utente sta "scorrendo", imposta la visibilità della vista su INVISIBILE e memorizza la cache del disegno in una bitmap separata (Bitmap bmp = myView.getDrawingCache();)

  2. Disegna quella bitmap nello stesso punto come la vista e utilizzare i metodi di traduzione Canvas per spostare la posizione in base alla posizione x del punto di tocco dell'utente.

  3. Dopo che l'utente ha lasciato andare, tradurre di nuovo (preferibilmente senza intoppi con un'animazione), riciclare la bitmap e impostare la vista su VISIBLE.

+0

Ho passato questo commento ad alcuni amici, alcuni che conoscono Android e/o programmazione, e alcuni che non lo fanno. Tutti hanno condiviso la mia sensazione che se questo è il modo corretto di fare cose come questa, non sembra buono per Android. È questo il modo corretto di fare cose come questa in Android? O è solo un trucco per farlo? Sono sorpreso che questo non sia un problema ben documentato con una soluzione. –

+0

Molte cose in Android si sentono come hack. Immagino che possa essere ridimensionato in quale caso è meglio per te. Se sei sicuro che la riga non cambierà, questo sembra un buon approccio. Altrimenti, userei setPadding(). –

1