Cómo obtener el tamaño de la pantalla de Android de forma programática, de una vez por todas?

¿Cómo puedo averiguar mi tamaño de pantalla de forma programática, en las unidades utilizadas por los eventos táctiles y Ver medición / diseño? En otras palabras, quiero las coordenadas de la esquina inferior derecha de la pantalla, en el sistema de coordenadas utilizado por los eventos táctiles ' getRawX()/getRawY() y View.getLocationOnScreen() .

Estoy dudoso de llamar a las unidades de evento / vista deseadas "píxeles", ya que evidentemente hay varias nociones de "píxeles" en mi teléfono en varios modos, y no se suman a una historia coherente.

Veo que se ha pedido y contestado mucho en stackoverflow y en otros lugares, pero ninguna de las respuestas realmente funciona en mi teléfono (droid 4, android 4.1.2) en todos los modos:

  • ¿Puedo averiguar el ancho de la pantalla mediante programación en la aplicación android?
  • Cómo puedo obtener el ScreenSize mediante programación en android
  • Android set Ver visibilidad basada en el tamaño de la pantalla mediante programación
  • ¿Cómo obtengo la altura de la pantalla en Android?
  • Obtener la altura de la pantalla en Android
  • Https://groups.google.com/forum/#!topic/android-developers/IpxnfvDFrpc
  • Http://shuklaxyz.blogspot.com/2012/02/how-to-programmatically-figure-out.html
  • Http://coderock.net/how-to-determine-screen-resolution-programmatically/
  • Http://www.codeproject.com/Tips/313848/Get-actual-screen-size-for-the-application-layout
  • Android y el ajuste de ancho y altura de forma programática en unidades dp
  • Http://www.simplecodestuffs.com/how-to-get-screen-dimensions-programmatically-in-android/
  • Http://www.androidsnippets.com/get-size-and-orientation-of-the-screen
  • Http://grokbase.com/t/gg/android-developers/127aatfqb6/how-to-determine-screen-resolution-programmatically

(¡Guau!)

Esto es para el código de la biblioteca que necesita trabajar independientemente de si la aplicación está en "modo de compatibilidad de pantalla" (es decir, targetSdkVersion <= 10 en el manifiesto) o no, y tampoco quiero hacer ninguna suposición sobre la posición, el tamaño , O la existencia de la barra de estado o cualquier otra decoración de pantalla similar.


Aquí están los hechos:

  1. Mi teléfono (un droide 4 android android 4.1.2) tiene 540×960 píxeles físicos, es decir, pocos puntos brillantes coloreados.

  2. El tamaño de la pantalla en las unidades deseadas, desde ver eventos táctiles y Ver mediciones, es 360×640 cuando la aplicación está en modo compatible con pantalla, 540×960 cuando la aplicación no está en modo compatible con pantalla. Estos son los números que necesito encontrar mediante programación, sin mucking con eventos táctiles o Views para encontrarlos, pero estoy teniendo extrema dificultad para encontrar cualquier API que devuelva estos números.

  3. Los objetos Display y DisplayMetrics obtenidos de varias maneras afirman que el tamaño de la pantalla es de 540×960 "píxeles" (ya sea en modo compatible con pantalla o no). Para ser específico, los siguientes todos dicen 540×960 todo el tiempo: DisplayMetrics. {Width, height} Píxeles, Display.getSize (), Display.getRealSize (), Display.get {Width, Height} ()

  4. Objetos de configuración obtenidos de varias maneras todos dicen pantalla {Ancho, Altura} Dp = 360×614 (ya sea en modo compatible con pantalla o no). No creo que represente toda la pantalla, ya que la relación de aspecto es incorrecta. (Creo que es toda la pantalla menos la barra de estado, necesito toda la pantalla.) Creo que es seguro decir que toda la pantalla es de 360×640 dp, aunque no conozco ninguna API que devuelva ese 640.

  5. DisplayMetrics obtenido de varias maneras decir que la "densidad" es 1.0f cuando en modo compatible con pantalla, 1.5f cuando no está en modo compatible con pantalla.

  6. getWindow().getAttributes().{width,height} no es útil ya que normalmente contiene MATCH_PARENT lugar de tamaños reales. Pero aparentemente puedo obtener la respuesta deseada de una actividad getWindow().getDecorView().getMeasured{Width,Height}() (que es realmente sorprendente ya que el decorView de la ventana de la actividad no parece que está ocupando toda la pantalla; Parece que está ocupando la pantalla menos la barra de estado). Pero no quiero confiar en esto porque si la ventana nunca se vuelve a clasificar según el tamaño (el teclado suave que aparece? Alguien que llama a window.setAttributes ()? O tal vez no estoy en una actividad en absoluto), esto va a ser claramente todo incorrecto.

Entiendo que la siguiente fórmula se supone que contiene: píxeles = densidad dp * Esto parece estar de acuerdo con todos los números reportados (3, 4, 5) arriba cuando no está en modo de compatibilidad de pantalla: 540×960 = 360×640 * 1.5 Pero en modo de compatibilidad de pantalla no se suma: 540×960! = 360×640 * 1 Por lo tanto, algo está mal.

La explicación más sencilla, creo, es que los métodos enumerados en (3) arriba simplemente dan la respuesta equivocada para "píxeles" cuando están en modo de compatibilidad de pantalla, es decir, tenían la intención de devolver 360×640 "píxeles" pero están erróneamente Devolviendo 540×960 en su lugar. Pero puede haber otras maneras de verlo.

En cualquier caso, obtener los números deseados independientemente del modo, de las piezas de rompecabezas anteriores, es sin duda un enigma difícil. He encontrado una forma que parece funcionar en mi teléfono en ambos modos, pero es extremadamente tortuoso, y se basa en dos suposiciones que todavía parecen bastante inestable (como se describe en los comentarios de código a continuación).

Aquí está mi receta:

 /** get screen size in "pixels", ie touchevent/view units. * on my droid 4, this is 360x640 or 540x960 * depending on whether the app is in screen compatibility mode * (ie targetSdkVersion<=10 in the manifest) or not. */ public void getScreenSizePixels(int widthHeightInPixels[/*2*/]) { Resources resources = getResources(); Configuration config = resources.getConfiguration(); DisplayMetrics dm = resources.getDisplayMetrics(); // Note, screenHeightDp isn't reliable // (it seems to be too small by the height of the status bar), // but we assume screenWidthDp is reliable. // Note also, dm.widthPixels,dm.heightPixels aren't reliably pixels // (they get confused when in screen compatibility mode, it seems), // but we assume their ratio is correct. double screenWidthInPixels = (double)config.screenWidthDp * dm.density; double screenHeightInPixels = screenWidthInPixels * dm.heightPixels / dm.widthPixels; widthHeightInPixels[0] = (int)(screenWidthInPixels + .5); widthHeightInPixels[1] = (int)(screenHeightInPixels + .5); } 

¿Hay alguna manera mejor / más limpia de encontrar el tamaño de la pantalla?

 Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 

Ahora puede medir el tamaño de la pantalla en píxeles, que es una unidad de medida mejor que centímetro porque todos los botones, vistas de texto, etc. se miden en esta unidad. Que lo que uso normalmente

Mediante el uso de DisplayMetrics puede obtener la altura y el ancho de la pantalla de cualquier dispositivo. Aquí está el código.

 DisplayMetrics metrics; int width = 0, height = 0; 

En su método onCreate

  metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); height = metrics.heightPixels; width = metrics.widthPixels; 

Prueba esto.

En su # 6, usted nota que el DecorView parece proporcionar lo que usted quiere, pero usted no piensa que es realiable. Creo que está lo más cerca posible. De acuerdo con la documentación de Window.getDecorView :

Recupere la vista de decoración de la ventana de nivel superior (que contiene el marco de la ventana estándar / decoraciones y el contenido del cliente dentro de la misma), que se puede agregar como ventana al gestor de ventanas.

La barra de estado es parte de la decoración de la ventana mencionada allí. Los teclados de software y otras superposiciones recibirán su propia ventana, por lo que no deben interferir con los valores relevantes. Es correcto que no sea precisamente la métrica de visualización, pero si su aplicación es pantalla completa siempre debe ser el tamaño de pantalla completa filtrada a través del traductor de compatibilidad. Otras aplicaciones no tendrán acceso a la Window su aplicación, por lo que no hay necesidad de preocuparse por alguna otra aplicación que cambia los atributos mientras no está buscando.

Espero que ayude.

Si está utilizando api nivel 17 o superior echa un vistazo a getRealMetrics y getRealSize en Display

Para api nivel 14,15 y 16 mirar aquí

Debo poner esto como un comentario, pero no tengo el representante para eso.
Esto puede no ser una respuesta totalmente correcta pero tengo mis dimensiones cuando cambié la altura y el ancho en el método DisplayMetrics.

  DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); width = metrics.heightPixels; height = metrics.widthPixels; 

Como he dicho esto puede no ser correcto, pero no sé por qué, pero funcionó para mí.

He utilizado el teorema de Pythagoras para encontrar el tamaño diagonal de la pantalla del teléfono / tablet de Android, el mismo principal se puede aplicar a la pantalla del iPhone o Blackberry.

 DisplayMetrics met = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(met);// get display metrics object String strSize = new DecimalFormat("##.##").format(Math.sqrt(((met.widthPixels / met.xdpi) * (met.widthPixels / met.xdpi)) + ((met.heightPixels / met.ydpi) * (met.heightPixels / met.ydpi)))); // using Dots per inches with width and height 

Pitágoras debe haber sido un genios, conocía la programación de teléfonos inteligentes hace tantos años: p

Utilizo el siguiente método para obtener el ancho del dispositivo:

 public static int getDeviceWidth(Context context){ WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); int width=display.getWidth(); return width; } 

Creo que esta función le ayudará a obtener simplemente el ancho y la altura de su tamaño de pantalla Android. La función devuelve el ancho y la altura como una matriz de números enteros como se muestra a continuación

 private int[] getScreenSIze(){ DisplayMetrics displaymetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); int h = displaymetrics.heightPixels; int w = displaymetrics.widthPixels; int[] size={w,h}; return size; } 

Y en su método de creación de salida de su ancho y altura, como se muestra a continuación

  int[] screenSize= getScreenSIze(); int width=screenSize[0]; int height=screenSize[1]; screenSizes.setText("Phone Screen sizes \n\n width = "+width+" \n Height = "+height); 

Descarga el código fuente y pruébalo en tu android studio

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.