2010-09-28 13 views
21

Tengo una implementación de ViewFlipper que necesita ser mejorada. Este ViewFlipper tiene tres vistas secundarias. Básicamente, quiero un indicador en qué vista infantil está actualmente activo. Mi ViewFlipper es solo una parte de un diseño complejo que también tiene vistas de lista, etc.Oyente para widget de ViewFlipper voltear eventos

El cambio de vistas también es automático y se realiza en un intervalo especificado.

De la referencia SDK de Android, no he visto ningún oyente cuando ViewFlipper cambia la vista secundaria.

¿Ustedes saben de qué manera puedo tener un oyente para ese evento?

¿O hay formas alternativas en que puedo implementar esta función además de usar ViewFlipper?

Gracias!

Respuesta

36

Si aplica animación (fuera o en animación) al cambiar de vista, puede configurar el oyente a una animación y, por ejemplo, actuar al final de la animación.

viewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() { 
     public void onAnimationStart(Animation animation) {} 
     public void onAnimationRepeat(Animation animation) {} 
     public void onAnimationEnd(Animation animation) {} 
    }); 
+2

1 Gracias! Eso lo clavó. Estaba usando parámetros de animación basados ​​en xml, así que lo extrañé por completo. Así que ahora creé los parámetros de animación ViewFlipper dentro de mi Actividad en lugar de tenerlos en mi xml. –

+0

en general, me parece más conveniente establecer más en código que en xml – slinden77

+0

Solo funciona si quieres (y tienes) una animación en primer lugar :) De lo contrario, es nulo –

-1

Si bien esta es una vieja pregunta, encontré un enfoque decente que funciona.

public class MainLaunch extends Activity { 

    ... main setup and code 

    int currentIndex = 0; 
    int maxIndex = 3; 

    // set specific animations for the view flipper on showNext 
    // only showNext while in valid index 
    public void showNext() { 
     if(currentIndex < maxIndex) 
     { 
      currentIndex++; 
      viewFlipper.setInAnimation(getBaseContext(), R.anim.slide_in_left); 
      viewFlipper.setOutAnimation(getBaseContext(), R.anim.slide_out_right); 
      viewFlipper.showNext(); 
     } 
    } 

    // set specific animations for the view flipper on showPrevious 
    // only showPrevious while in valid index 
    public void showPrevious() { 
     if(currentIndex > 0) 
     { 
      currentIndex--; 
      viewFlipper.setInAnimation(getBaseContext(), R.anim.slide_in_right); 
      viewFlipper.setOutAnimation(getBaseContext(), R.anim.slide_out_left); 
      viewFlipper.showPrevious(); 
     } 
    } 

    // get current flipped view 
    public View getCurrentView() { 
     return viewFlipper.getChildAt(currentIndex); 
    } 


} 

entonces para usar el ViewFlipper se llama shownext() o showPrevious en cualquier lugar y puede obtener la vista activa llamando getCurrentView(). Esto ayuda a configurar diferentes animaciones para invertir de izquierda a derecha y para obtener fácilmente vistas de trabajo actuales.

0

puedo encontrar una manera de detectar cuál de los niños permanece prendido:

addOnLayoutChangeListener a ViewFlipper y getCurrentView de ViewFlipper, a continuación, comparar con la del niño de ViewFlipper.

recordar a removeOnLayoutChangeListener cuando la actividad onDestory

private View page1, page2, page3, page4; 
private ViewFlipper viewFlipper; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.flipper); 

    page1 = findViewById(R.id.MyFlipper_page01); 
    page2 = findViewById(R.id.MyFlipper_page02); 
    page3 = findViewById(R.id.MyFlipper_page03); 
    page4 = findViewById(R.id.MyFlipper_page04); 

    viewFlipper = (ViewFlipper) findViewById(R.id.MyFlipper_flipper); 

    viewFlipper.addOnLayoutChangeListener(onLayoutChangeListener_viewFlipper); 

} 

View.OnLayoutChangeListener onLayoutChangeListener_viewFlipper = new View.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 

     if(viewFlipper.getCurrentView() == page1) 
      Log.d("test", "change to flipper_page1"); 
     else if(viewFlipper.getCurrentView() == page2) 
      Log.d("test", "change to flipper_page2"); 
     else if(viewFlipper.getCurrentView() == page3) 
      Log.d("test", "change to flipper_page3"); 
     else if(viewFlipper.getCurrentView() == page4) 
      Log.d("test", "change to flipper_page4"); 



    } 
}; 


@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    viewFlipper.removeOnLayoutChangeListener(onLayoutChangeListener_viewFlipper); 

} 
Cuestiones relacionadas