2011-12-20 12 views
12

tengo una transición con este aspecto:¿Cómo puedo repetir una transición para siempre?

<?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> 

y el Código con este aspecto:

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

Mi problema es que no sé cómo repetir esta transición para siempre, por lo que puede crear un efecto pulsante.

Editar:

dejar las cosas claras: El código se ejecuta cuando se crea un punto de vista (listitem), por lo que los bucles no son la solución.

Respuesta

-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 
      } 
     } 

Eso puede o no funcionar correctamente. Lo digo porque durante la transición de 2 segundos, el ciclo while continuará en bucle, se llamaría nuevamente al startTransition, y nuevamente, y nuevamente, y nuevamente. Puede usar una declaración condicional para verificar la hora actual y verificar si la última hora de inicio es inferior a 2000.

Esto puede no ser el mejor, pero un ciclo while es un buen lugar para comenzar.

Si necesita, podría intentar dar un mejor ejemplo de código que administre mejor el ciclo while, pero debe intentarlo primero.

+0

Looping no funciona, porque bloquea. Este divisor es parte de un elemento de lista en una vista de lista. Ejecuto este código cuando creo la vista. – CPlusPlus

+0

Intenta usar un hilo? Eso puede ser un poco complicado porque no puede actualizar el subproceso de interfaz de usuario de un subproceso de trabajo, pero puede ser factible. Tendría que usar un controlador también para la comunicación.Supongo que realmente no sé a dónde ir después. – Jakar

+0

Eso es realmente complicado, creo. Pensé en animaciones, pero no encontré nada comparable en la web:/ – CPlusPlus

4

Sé que esta pregunta es viejo, pero me gustaría ayudar a otros usuarios con otra solución posible.

AnimationDrawable es la forma correcta cuando tiene más de 2 imágenes, pero cuando solo tiene dos imágenes, puede usar TransitionDrawable también, como usted dijo. Te mostraré cómo hacerlo.

En la primera vez, usaré un temporizador en mi onCreate().

Timer MyTimerImage = new Timer(); 

Luego, crearé una clase MyTimerTask para ejecutar mi propio código.

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); 
       } 

      }}); 
    } 

} 

Y finalmente, crearé una variable MyTimerTask para ejecutar mi temporizador. Este código está por debajo de la creación del temporizador().

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

En este caso, el método de programación tiene 3 parámetros: primero indica nuestra tarea TimerTask, segundo es la demora para ejecutar el TimerTask en ms, y el tercero indica cada periodo queremos ejecutar el código.

No olvide incluir su archivo TransitionFile.xml en su android:background.

Espero que pueda ayudar a alguien.

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

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

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

Agregue un poco de contexto alrededor de su fragmento de código o podría ser difícil para los usuarios entender su enfoque. – RBT

Cuestiones relacionadas