2011-12-20 12 views
12

Ho una transizione simile a questo:Come posso ripetere una transizione per sempre?

<?xml version="1.0" encoding="UTF-8"?> 
<transition xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item android:drawable="@drawable/divider"/> 
    <item android:drawable="@drawable/divider_active"/> 

</transition> 

e codice simile a questo:

View divider = v.findViewById(R.id.divider); 
if (divider != null) { 
    TransitionDrawable transition = (TransitionDrawable) divider.getBackground(); 
    transition.startTransition(2000); 
} 

Il mio problema è, non so come ripetere questa transizione per sempre, in modo da poter creare un effetto pulsante.

Edit:

di fare chiarezza: il codice viene eseguito durante la creazione di una vista (listitem), quindi i cicli non sono una soluzione.

risposta

-2
View divider = v.findViewById(R.id.divider); 
    boolean loop = true; 
     while (loop) { 
      TransitionDrawable transition = (TransitionDrawable) divider.getBackground(); 
      transition.resetTransition(); //I don't really know if this is necessary 
      transition.startTransition(2000); 
      //you'll want to stop SOME time. 
      if (wantToStop){ 
       loop = false 
      } 
     } 

Potrebbe funzionare o meno. Dico questo perché durante la transizione di 2 secondi, il ciclo while continuerà a loopare, startTransition verrebbe chiamato di nuovo, e ancora, e ancora e ancora. È possibile utilizzare un'istruzione condizionale per verificare l'ora corrente e verificare se l'ultima ora di avvio è inferiore a 2000.

Questo potrebbe non essere il migliore, ma un ciclo while è un buon punto di partenza.

Se è necessario, potrei provare a fornire un esempio di codice migliore che gestirà meglio il ciclo while, ma dovresti provare prima.

+0

Il ciclo non funziona perché blocca. Questo divisore fa parte di un listino in una listview. Eseguo questo codice quando creo la vista. – CPlusPlus

+0

Prova ad usare una discussione? Questo potrebbe essere un po 'complicato perché non è possibile aggiornare il thread dell'interfaccia utente da un thread di lavoro, ma potrebbe essere fattibile. Dovresti usare un gestore anche per la comunicazione.Immagino di non sapere veramente dove andare dopo. – Jakar

+0

Penso che sia davvero complicato. Ho pensato alle animazioni, ma non ho trovato nulla di paragonabile nel web:/ – CPlusPlus

4

so che questa domanda è vecchia, ma vorrei aiutare altri utenti con altra soluzione possibile.

AnimationDrawable è il modo corretto quando si dispone di più di 2 immagini, ma quando si dispone solo di due immagini, è possibile utilizzare anche TransitionDrawable, come hai detto. Ti mostrerò come farlo.

Nella prima volta, utilizzerò un timer nel mio onCreate().

Timer MyTimerImage = new Timer(); 

Quindi, creerò una classe MyTimerTask per eseguire il mio codice.

public class MyTimerTask extends TimerTask { 
    LinearLayout myIDLinearLayout= (LinearLayout) findViewById(R.id.myIDofLinearLayout); 

    TransitionDrawable MyTrans = (TransitionDrawable) myIDLinearLayout.getBackground(); 

    int i = 0; 
    @Override 
    public void run() { 
     runOnUiThread(new Runnable(){ 

      @Override 
      public void run() { 
       i++; 
       if (i%2==0) { // 
        MyTrans.startTransition(myTransitionTimeinms); 
       }else{ 
        MyTrans.reserveTransition(myTransitionTimeinms); 
       } 

      }}); 
    } 

} 

E infine, creerò una variabile MyTimerTask per eseguire il mio timer. Questo codice va sotto la creazione del Timer().

MyTimerTask MyTimer = new MyTimerTask(); 
    MyTimerImage.schedule(MyTimer, myDelay, myPeriod); 

In questo caso, il metodo di pianificazione ha 3 parametri: prima indica il nostro compito TimerTask, secondo è il ritardo di eseguire il TimerTask in ms, e il terzo indica ogni periodo vogliamo eseguire il codice.

Non dimenticare di includere il file TransitionFile.xml nel numero android:background.

Spero che possa aiutare qualcuno.

1
public void repeat(){ 
    new CountDownTimer(2000, 1000){ 

     public void onTick(long millisUntilFinished){ 
      transition.startTransition(2000); 
     } 

     public void onFinish() { 
      transition.resetTransition(); 
      repeat(); 
     } 
    }.start(); 
} 
+0

Aggiungi un po 'di contesto attorno al tuo snippet di codice o potrebbe essere difficile per gli utenti capire il tuo approccio. – RBT

Problemi correlati