2012-09-26 18 views
6

Tengo un ViewFlipper configurado para voltear automáticamente cada 5 segundos. Dejando de lado algunos de los detalles, parece que esto y funciona bien:Cómo detener Android ViewFlipper para que no se repita?

ViewFlipper flipper = (ViewFlipper) findViewById(R.id.myflipperid); 

flipper.setFlipInterval(5000);        
flipper.setInAnimation(inFromRightAnimation()); 
flipper.setOutAnimation(outToLeftAnimation()); 

flipper.startFlipping(); 

Sin embargo, tengo un caso en el que quiero que el auto-mover de un tirón para detener en el último punto de vista, en lugar de un bucle en torno a empezar de nuevo . No parece que ViewFlipper o cualquiera de las clases heredadas tenga un método de control de bucle.

¿Cómo puedo obtener ViewFlipper para dejar de recorrer sus vistas secundarias cuando llega al último?

Nota: la respuesta dada here no se aplica a mi caso, ya que necesito capturar ViewFlipper al final de su lista, es decir, sin depender de la entrada del usuario. Gracias.

Respuesta

6

No lo he intentado, pero espero que esto ayude.

Primero, intente escuchar los eventos de flip de su viewflipper. Dado que está utilizando una animación. Es posible utilizar la solución publicado aquí: https://stackoverflow.com/a/3813179/1594522

Entonces, onAnimationEnd(), se puede comprobar si el viewflipper está en su último punto de vista del niño. Si ya está en su última vista secundaria, llame a flipper.stopFlipping().

Espero que ayude! :)

+1

Sí, esto es exactamente lo que hice ayer. Me ganaste al publicar una respuesta, ¡así que te daré la marca de verificación! Mi solución real se publica a continuación. – gcl1

0

acaba de obtener el tamaño de la lista, y luego en el caso de condiciones, dicen

flipper.stopFlipping() 

esperar que funcione de esta manera.

8

Aquí está la solución que utilicé. Como se sugiere here, el truco es escuchar el final del evento de animación, y luego verificar si la aleta está en la última vista.

flipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() { 

    public void onAnimationStart(Animation animation) {} 
    public void onAnimationRepeat(Animation animation) {} 
    public void onAnimationEnd(Animation animation) { 

     int displayedChild = flipper.getDisplayedChild(); 
     int childCount = flipper.getChildCount(); 

     if (displayedChild == childCount - 1) { 
      flipper.stopFlipping(); 
     } 
    } 
}); 

Gracias por su respuesta.

+0

¿Qué es "flipperWall" en su ejemplo? –

+0

Lo siento, dejé la declaración. En este ejemplo, flipperWall es solo una aleta de vista, como esta: ViewFlipper flipperWall ;. También deberá inicializarlo desde un archivo XML, utilizando findViewById(), o programándolo de manera gráfica. ¡Buena suerte! – gcl1

+0

He editado la respuesta. Vea si tiene más sentido ahora. –

Cuestiones relacionadas