2011-06-16 16 views
10

Actualmente estoy teniendo dificultades para mostrar una ventana TYPE_SYSTEM_ALERT en modo de pantalla completa. Me gustaría hacerlo para tener una vista de superposición, creada a partir de un servicio, en la parte superior de la barra de estado, pero sin ocultarla.¿Cómo mostrar una ventana de TYPE_SYSTEM_ALERT a pantalla completa?

Sin embargo, poner el indicador FLAG_FULLSCREEN en los parámetros de diseño de la ventana que estoy creando no parece funcionar. Encontré los permisos STATUS_BAR y EXPAND_STATUS_BAR, pero no pude encontrar cómo usarlos.

Éstos son los LayoutParams:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
      WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      PixelFormat.TRANSLUCENT); 

    params.gravity = Gravity.RIGHT | Gravity.TOP; 

    mWindowManager.addView(mOverlayView, params); 

¿Alguna idea?

Gracias

+0

He estado usando una técnica similar para renderizar una transmisión de video imagen a imagen sobre cualquier aplicación. Sin embargo, la tasa de actualización de la Vista creada con su método parece estar vinculada a la tasa de actualización de las vistas debajo de ella. ¿Sabes si hay una manera de desacoplar las tasas de actualización y maximizar la tasa de actualización de la superposición transparente? – user48956

Respuesta

17

¡Encontré la solución al intentar hacer otra cosa!

Con el fin de tener una ventana TYPE_SYSTEM_ALERT en la parte superior de cada ventana y otro en la parte superior de la barra de estado debe agregar la bandera FLAG_LAYOUT_IN_SCREEN y no la bandera FLAG_LAYOUT_FULLSCREEN:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
     WindowManager.LayoutParams.WRAP_CONTENT, 
     WindowManager.LayoutParams.WRAP_CONTENT, 
     WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
     WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
     WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
     PixelFormat.TRANSLUCENT); 

mWindowManager.addView(mOverlayView, params); 
+1

La barra de estado todavía se puede bajar. Cambié el PixelFormat a OPAQUE para poder ver la nueva vista y cubre la barra de estado, sin embargo, cuando deslizo hacia abajo desde la parte superior de la pantalla, el estado aún se expande y se puede hacer clic. ¿Algunas ideas? – MindWire

+0

¡muy útil! Estaba buscando una forma de crear un cursor emulado, como era posible en Windows Mobile, y gracias a su ayuda, lo tengo – radhoo

+1

Funciona para la barra de estado. ¿Alguna idea de cómo hacerlo en la parte superior de la barra de navegación también? – AnAurelian

4

No funciona más en Ice Cream Sandwich. La barra de estado cubre una ventana TYPE_SYSTEM_ALERT. Pero TYPE_SYSTEM_OVERLAY todavía funciona bien.

+1

Claro que es un problema porque OVERLAY no acepta MotionEvents de la misma manera, solo con el indicador WATCH_TOUCH_OUTSIDE, y todos los eventos tendrán una acción de ACTION_OUTSIDE. – Tom

Cuestiones relacionadas