2011-12-29 19 views
11

Tengo una vista (vista personalizada) agregada al WindowManager.Vista animada agregada en WindowManager

WindowManager mWm = (WindowManager)activity.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT, 0, PixelFormat.TRANSPARENT); 
mWl.dimAmount = 0.0f; 
mWm.addView(customView, mWl); 

Dentro de la vista personalizada, llamaré a una animación de traducción cuando se presiona el botón de cerrar.

//// Este es el controlador para la animación ////

final Handler translateHandler = new Handler(); 

final Runnable mtranslateUp = new Runnable() { 
    public void run() { 
     Log.v("TEST","mtranslateUp Runnable"); 
     startAnimation(translateUp); 
    } 
}; 

//// Este es el detector para el botón de cierre ////

View.OnClickListener closeButtonListener = new View.OnClickListener() {   

    public void onClick(View v) { 
     translateHandler.post(mtranslateUp); 
    } 
}; 

//// Esta es la animación de traducción ////

translateUp = new TranslateAnimation(0,0,0,-200); 
translateUp.setFillAfter(true); 
translateUp.setDuration(1000); 
translateUp.setAnimationListener(new AnimationListener(){ 
     @Override 
     public void onAnimationEnd(Animation animation) { 
      Log.v("TEST","translateUp onAnimationEnd"); 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 
     } 

     @Override 
     public void onAnimationStart(Animation animation) { 
      Log.v("TEST","translateUp onAnimationStart"); 
     }} 
    ); 

Si la vista personalizada se agrega a una actividad, ¡este código funciona bien!

Cuando se agrega la vista personalizada a un administrador de ventanas, el registro dentro de onAnimationStart no se muestra pero se puede mostrar el registro dentro de Runnable.

¿Alguien puede decir cómo hacer animación en una vista que se agrega a WindowManager?

+0

¿Tiene alguna solución para esto? Por favor comparta, también estoy enfrentando el mismo problema – om252345

Respuesta

7

Estaba enfrentando un problema similar con una Vista unida a WindowManager.Intente agregar ViewGroup a WindoManager que Ver directamente. Deberia de funcionar.

+0

Intenté esto y no funcionó :( – BVB

+0

Gracias por la sugerencia. Funciona para mí :) – alex

+0

¡Esto también funcionó para mí! great tip –

0

windowManager necesita una animación por sistema android. para que la animación personalizada no funcione

10

Debe animar la vista LayoutParameters. Por ejemplo, yo utilizo un método para actualizar la vista de diseño:

public void updateViewLayout(View view, Integer x, Integer y, Integer w, Integer h){ 
    if (view!=null) { 
     WindowManager.LayoutParams lp = (WindowManager.LayoutParams) view.getLayoutParams(); 

     if(x != null)lp.x=x; 
     if(y != null)lp.y=y; 
     if(w != null && w>0)lp.width=w; 
     if(h != null && h>0)lp.height=h; 

     mWindowService.updateViewLayout(view, lp); 
    } 
} 

Obviamente mWindowService es context.getSystemService (Context.WINDOW_SERVICE). Disparo este método en la animación:

public static void overlayAnimation(final View view2animate, int viewX, int endX) { 
    ValueAnimator translateLeft = ValueAnimator.ofInt(viewX, endX); 
    translateLeft.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator valueAnimator) { 
      int val = (Integer) valueAnimator.getAnimatedValue(); 
      updateViewLayout(view2animate, val, null, null, null); 

     } 
    }); 
    translateLeft.setDuration(ANIMATION_DURATION); 
    translateLeft.start(); 
} 
+1

Genial, esta es la manera de hacerlo bien sin envolver la vista en ViewGroup – qbasso

+0

Esta es la única solución que funcionó para mí, ¡gracias! Intenté usar TranslateAnimation pero no dados. –

Cuestiones relacionadas