Tamaño de la barra de notificaciones y la barra de título de Android

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

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 proporción. Actualmente escondo las barras porque no puedo ver una mejor manera.

Tal vez este sea un enfoque útil: en referencia a las Pautas de diseño de icons, solo hay tres alturas diferentes para la barra de estado (notificación) dependiendo de la densidad de la pantalla:

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

Entonces, si recuperas la densidad de pantalla del dispositivo usando densityDpi de DisplayMetrics , sabes qué valor restar

por lo que podría verse algo así:

  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"); 

La respuesta de Martin especificó la altura incorrecta (al menos a partir de SDKv11). De acuerdo con las Pautas de diseño de icons , los icons de la barra de estado tienen una altura de 25dp, no 32dp. 25dp se traduce en estas alturas específicas de densidad:

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

Una manera fácil de observar estos tamaños es usar el hierarchyviewer contra un emulador o dispositivo con una densidad normal. Simplemente observe el valor de getHeight() para getHeight() 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 de forma indirecta mirando mTop para mTop 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 icons de la barra de estado (no he visto una statement de este hecho en la ref de Android a partir de SDKv11).

* Por 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; }* 

hola, creo que no es necesario y eso será automáticamente si usas 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(); 

¡He encontrado un tutorial que podría ser útil para mí! ¿Cómo boost el tamaño de la barra de título en una aplicación de Android? ¡puedes cambiar el tamaño de tu barra de título y de la forma que quieras, puedes conseguirlo con suerte! que te diviertas

lo siento por un comentario ficticio, pero no es correcto 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 si lo recibes te 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.

para el perezoso:

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

también puedes usar

 getWindow().getDecorView().getRootView() 

en lugar de YourActivityViewHere

Esto funciona mejor que los valores de hardcoding porque Android aún devolverá el valor que sería el alto de la barra de estado o de la barra de acciones en ese dispositivo en particular, aunque puede que no estén visibles.

Entonces, la idea es obtener la vista de contenido en la que se agregan todas tus vistas.

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

Entonces, en tu actividad

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

Lo bueno del código anterior es que también dará cuenta de la barra de acciones.