Animazioni e Binding

di Marco Leoncini, in Windows Phone,

Nelle ultime settimane sto lavorando a un applicazione Windows Phone 7/8 chiamata guida tv. Come è facilmente intuibile dal nome, l'applicazione mostra il palinsesto delle principali tv italiane.

Nel realizzare le mie applicazioni faccio sempre attenzione ad inserire delle brevi animazioni che vadano a "comporre" l'interfaccia, non sono essenziali al funzionamento, ma rendono più piacevole l'utilizzo dell'applicazione.

Se come me utilizzare amate realizzare le vostre applicazioni utilizzando un architettura Model View ViewModel, anche le animazioni sono "comandate" dal ViewModel.

Nel mio caso l'animazione di "montaggio" dell'UI viene seguita solo quando tutti i dati sono stati recuperati.

tv

Nell'immagine precedente potete vedere 5 fotogrammi dell'animazione.

Mi sono subito trovato di fronte ad un problema: l'animazione era scattosa ed alcuni fotogrammi venivano saltati. Il codice utilizzato nel ViewModel per inizializzare le collezioni dei programmi, e fare il property changed della proprietà che controlla l'animazione è il seguente.

code

Per il ViewModel ho usato Caliburn Micro, il metodo NotifyOfPropertyChange si aggancia all'implementazione dell'interfaccia INotifyPropertyChanged. Quanto la proprietà TodayOnAirIsLoading diventa false, partono le animazioni.

Sono rimasto un po' a pensare su come risolvere il problema della perdita di alcuni fotogrammi, il codice è semplice e non ci sono margini di migliorarne i tempi d'esecuzione. Dopo alcune elucubrazioni mi sono ricordato: il Thread UI è occupato a fare il Binding, le animazioni eseguite in contemporanea ne risultano inevitabilmente penalizzate. L'unico modo serio di posticipare l'avvio dell'animazioni e farlo quando il Thread UI è di nuovo libero, ma come capirlo? Semplicemente accodando l'operazione di notifica dell'aggiornamento della proprietà sul Dispatcher, il solito che si sta occupando di eseguire il Binding.

Quindi il codice precedente cambia come segue:

code 2

Con questa modifica mi sono assicurato che la notifica avvenga solo quando il Thread UI è ormai libero e possa essere usato tutto per eseguire in modo fluido e completo l'animazione.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
Nessuna risorsa collegata
I più letti del mese