2010-08-30 15 views
21

¿Hay alguna manera de obtener el tamaño de la barra de notificaciones y la barra de título en Android? Por el momento puedo obtener ancho de la pantalla y la altura con:Tamaño de la barra de notificaciones android y barra de título?

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth(); 
int height = display.getHeight(); 

Después de eso quiero restar los tamaños de las barras para que pueda estirar un video sin perder la relación. Actualmente escondo las barras porque no puedo ver una mejor manera.

Respuesta

19

Tal vez este es un enfoque útil: Refiriéndose a la Icon Design Guidelines sólo hay tres diferentes alturas para el estado (notificación) bar dependiendo de la densidad de la pantalla:

  • 24px para LDPI
  • 32px para MDPI
  • 48px para HDPI

Así que si recupera la densidad de la pantalla del dispositivo mediante densityDpi de DisplayMetrics que saben el valor que debe restar

por lo que podría ser algo como lo siguiente:

DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    int myHeight = 0; 

    switch (metrics.densityDpi) { 
     case DisplayMetrics.DENSITY_HIGH: 
      Log.i("display", "high"); 
      myHeight = display.getHeight() - 48; 
      break; 
     case DisplayMetrics.DENSITY_MEDIUM: 
      Log.i("display", "medium/default"); 
      myHeight = display.getHeight() - 32; 
      break; 
     case DisplayMetrics.DENSITY_LOW: 
      Log.i("display", "low"); 
      myHeight = display.getHeight() - 24; 
      break; 
     default: 
      Log.i("display", "Unknown density"); 
+0

Esto parece prometedor. Traté de implementarlo, pero a pesar de que densityDpi se declara pública en el javadoc, no puedo acceder a él en Eclipse ... Usar densidad en cambio no parece ser una alternativa, como dice el javadoc: "Este valor no es exactamente sigue el tamaño de la pantalla real " – lalalei

+0

Voy a editar la respuesta para agregar algunas líneas de código ... – DonGru

+0

¡Gracias! No me di cuenta de que metrics.densityDpi no está disponible en Android 1.5. ¡Ahora cambio mi proyecto para usar 1.6 y funciona! Acabo de cambiar una cosa más: multipliqué los valores por 2, p. display.getHeight() - 48 * 2. Con esto restamos la altura de la barra de título Y la barra de notificaciones. Espero que esto sea válido para otros dispositivos también. Acabo de probarlo en el Nexus. – lalalei

1

hola yo creo que NO ES necesario y que será automáticamente si utiliza un VideoView

VideoView vv = (VideoView) findViewById(R.id.MainVideo);       
    MediaController mc=new MediaController(this); 
    mc.setEnabled(true); 
    mc.show(0); 
    vv.setMediaController(mc); 
    vv.setVideoURI(Uri.parse(URLMedia)); 
    vv.requestFocus(); 
    vv.showContextMenu(); 
    vv.start();   
+0

Uso SurfaceView en lugar de VideoView porque implementé una interfaz de usuario diferente para los elementos de control (necesitaba un control de volumen y un botón para cambiar a pantalla completa). No uso MediaController. – lalalei

17

respuesta de Martin especifica el mal altura (al menos a partir de SDKv11). Según Icon Design Guidelines, los iconos de la barra de estado tienen una altura de 25dp, no 32dp. 25dp traduce en estas alturas densidad específica:

  • 19px para LDPI
  • 25px para MDPI
  • 38px para HDPI
  • 50px para xhdpi

Una manera fácil de observar estos tamaños se utilizar el hierarchyviewer contra un emulador o dispositivo con una densidad normal. Simplemente mire el valor de getHeight() para el FrameLayout de la barra de título. La barra de estado es un poco más complicada porque es parte de DecorView y no una vista en sí misma, así que obtenga su altura indirectamente al mirar mTop para FrameLayout de la barra de título, que está inmediatamente debajo de la barra de estado. Según mis observaciones, la barra de estado y la barra de título coinciden con la altura de 25 pd de los iconos de la barra de estado (no he visto una declaración de este hecho en la ref de Android a partir de SDKv11).

0

lo siento por el comentario ficticio, pero eso no es correcto para usar constantes como altura de la barra de notificaciones. acaba de obtener la vista global (PhoneWindow $ DecorView) luego obtener su hijo (será una sola vista (FrameLayout)). este diseño contiene sus vistas de aplicaciones y mide toda la pantalla (@see FrameLayout.mHeight). el primer diseño será tu primera vista, por lo que obtener el top le dará la altura correcta de la barra de notificaciones.Usar FrameLayout sin su contexto no le traerá nada, porque la parte superior de su hijo será igual a 0 en ese caso.

por una de perezosos:

ViewGroup decoreView = (ViewGroup)*YourActivityViewHere*.getRootView(); 
int barSize = ((ViewGroup)decoreView.getChildAt(0)).getChildAt(0).getTop(); 

también se puede utilizar

getWindow().getDecorView().getRootView() 

en lugar de YourActivityViewHere

14

* En cuanto a lo que sé, esto funciona perfectamente.

public int getStatusBarHeight() { 
      int result = 0; 
      int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
      if (resourceId > 0) { 
       result = getResources().getDimensionPixelSize(resourceId); 
      } 
      return result; 
     }* 
+1

funciona, y esta es la mejor opción para conocer el tamaño exacto en todos los tamaños de pantalla. Gracias – Pelanes

0

Esto funciona mejor que waaaay hardcoding valores porque androide todavía devolverá el valor que sería la altura de la barra de estado o barra de acción en ese dispositivo particular, a pesar de que no pueden ser visibles.

Por lo tanto, la idea es obtener la vista de contenido en la que se agregan todas sus vistas.

public View getContentView(Activity a) { 
     int id = a.getResources().getIdentifier("content", "id", "android"); 
     return a.findViewById(id); 
    } 

Luego, en su actividad

View cView = getContentView(this); 
cView.post(()->{ 
int offsetY = cView.getTop(); 
// do whatever here. 
}); 

Lo bueno con el código anterior es que también tendrá en cuenta la barra de acción.

Cuestiones relacionadas