Autore Topic: Avviare un'animazione dopo un certo ritardo  (Letto 1016 volte)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 773
  • Respect: +161
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Avviare un'animazione dopo un certo ritardo
« il: 24 Febbraio 2011, 11:15:21 CET »
0
Salve,

ho bisogno di animare più View con la stessa animazione, ma per alcune di queste View dovrebbe avviarsi con un certo ritardo. Tipo "ola", per capirci :D

Il numero di View animate ed il ritardo deve essere dinamico.

Può essere utile Animation.setStartTime? Non ho trovato documentazione soddisfacente su questo metodo...

Grazie
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 773
  • Respect: +161
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Avviare un'animazione dopo un certo ritardo
« Risposta #1 il: 10 Marzo 2011, 17:34:18 CET »
0
L'unica soluzione che ho trovato è quella di avviare un thread che ha accesso ad una coda di animazioni. Utilizzo una coda con priorità, dove la priorità è stabilita dalla data di attivazione dell'animazione (espressa in millisecondi dal boot).

Il thread legge dalla coda tutte le animazioni da eseguire (quelle con data di attivazione minore o uguale a android.os.SystemClock.elapsedRealtime()) e le esegue. Quando trova una data futura si mette in attesa e setta un timeout che lo risveglia in tempo per avviare le nuove animazioni.

Esempio: ho 2 animazioni da avviare al tempo t1 ed una da avviare al tempo t2. Avvio il thread al tempo t0. Il thread non ha animazioni da avviare, quindi non fa nulla, ma vede che la successiva animazione avviane al tempo t1, quindi setta un timeout con Handler.postDelayed in modo che torni attivo al tempo t1.
Quando torna attivo, avvia le due animazioni che si devono avviare a t1, quindi setta nuovamente un timeout in modo da attivarsi al tempo t2.
Ecc.

Il sistema funziona ma è prono ad effetti collaterali, esempio se nella coda vengono inserite animazioni da eseguire prima dell'ultimo timeout impostato. In più la gestione della coda è prona a race condition.

Stavo valutando di utilizzare più thread ognuno dei quali, invece di andare a pescare nella coda sa quale animazione avviare (e su quale View, ovviamente). Nel mio caso si tratterebbe di avviare una dozzina di thread. Una gestione del genere è preferibile? Oppure l'utilizzo dei thread richiede molte risorse?

In alternativa, esistono altri sistemi per avviare la stessa animazione su View differenti con un preciso intervallo?

Grazie.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Avviare un'animazione dopo un certo ritardo
« Risposta #2 il: 10 Marzo 2011, 18:19:57 CET »
0
Il numero di View animate ed il ritardo deve essere dinamico.

Può essere utile Animation.setStartTime? Non ho trovato documentazione soddisfacente su questo metodo...

Forse può fare al caso tuo l'esperimento che avevo fatto ormai quasi un anno fa con la animazioni. C'è ancora nella sezione delle applicazioni open source sotto il nome Ask the Wheel.

L'estratto che ti interessa è questo, ci sono due animazioni unite una dietro l'altra in un AnimationSet e la seconda inizia quando finisce la prima. Alla fine associo tutto l'AnimationSet alla View che voglio animare.

Codice (Java): [Seleziona]
rotAni = new RotateAnimation(0,degs,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotAni.setInterpolator(new DecelerateInterpolator());
rotAni.setDuration(duration);
rotAni.setStartOffset(200);
rotAni.setFillAfter(true);
rotAni.setAnimationListener(mAniListener);
rotAni2 = new RotateAnimation(0,60*((6-pos)%6),Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotAni2.setDuration(1000);
rotAni2.setStartOffset(duration+2000);
rotAni2.setFillAfter(true);
ani = new AnimationSet(false);
ani.setFillAfter(true);
ani.addAnimation(rotAni);
ani.addAnimation(rotAni2);
imgView.startAnimation(ani);
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store