Como obtener la resolución de pantalla y densidad en Aplicaciones Android

En caso de una aplicación que no use la compatibilidad de resoluciones por xml (layout small, layout normal, layout large y ahora xlarge) para adaptarse a las distintas resoluciones de cada pantalla, la api de Android cuenta con la clase Display que se encuentra en el package View y la clase DisplayMetrics que está en util.

En su aplicación vas a poder controlar cada gráfico (drawable) de acuerdo al ratio de la pantalla y de su densidad. Existe en Android la relación DPI / pixeles que permite siempre medir en densidades en las distintas resoluciones (en pixel). Se trabaja con la unidad métrica Dip (Density-independent pixel) que equivale más o menos a 1.5 pixel ( escala ) para todo lo que es drawable y el cuerpo de las tipografías.

Con el Objeto Display entonces podemos calcular cuánto mide la pantalla del dispositivo en que se ve la aplicación, su orientación en el momento que se abre, el refreshrate de la pantalla.

Con el objeto DisplayMetrics, obtenemos la densidad por dpi y si el equipo es High Density o Low Density, Medium Density. De acuerdo a su densidad los valores en dip representan distintos valores en pixeles.

Por ejemplo:
300 dip en HVGA (320×480) son 300 pixeles
300 dip en WVGA800 (480×800) son 450 pixeles
1 dip en HVGA (480×854) son 1.5 pixeles

Teniendo en cuenta que la densidad de pantallas HVGA (HDPI) es superior a 240 dpi y hasta 300 dpi, y la densidad de WGA (LDPI) es de 160 dpi, existe ahora XHDPI que es a partir de 300 dpi y superior.

La relacion para averiguar a qué equivale un pixel según la densidad es:
pixels = dps * (scaleDensity / screendensity)

Para probar con un ejemplo, tenemos este código que permite encontrar a mano los pixeles según las resoluciones de pantalla cuando sólo tenemos los dps(Density-independent pixel) de un drawable, layout, tipografía:

package net.androidda.example.resolution;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
import android.widget.TextView;

public class MainActivity extends Activity {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        TextView text1 = (TextView) findViewById(R.id.text1);
        TextView text2 = (TextView) findViewById(R.id.text2);
        TextView text3 = (TextView) findViewById(R.id.text3);
        TextView text4 = (TextView) findViewById(R.id.text4);
        TextView text5 = (TextView) findViewById(R.id.text5);
    	Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    	
    	
    	text1.setText("Ancho de la Pantalla " + Integer.toString(display.getWidth()));
    	text2.setText("Alto de la pantalla " + Integer.toString(display.getHeight()));
    	text3.setText("Densidad de la pantalla (dpi) " + getResources().getDisplayMetrics().densityDpi);
    	
    	float scale = getApplicationContext().getResources().getDisplayMetrics().density;
    	text4.setText("Escala " + Float.toString(getApplicationContext().getResources().getDisplayMetrics().density));
    	
    	// buscando los pixeles a partir de dips con la densidad
    	int dips = 200;
    	float pixelBoton = 0;
    	float scaleDensity = 0;
    	
    	DisplayMetrics metrics = new DisplayMetrics();
    	getWindowManager().getDefaultDisplay().getMetrics(metrics);
    	
    	switch(metrics.densityDpi)
    	{
    	case DisplayMetrics.DENSITY_HIGH: //HDPI
    		text5.setText("Alta Densidad");
    		scaleDensity = scale * 240;
    		pixelBoton = dips * (scaleDensity / 240);
    		break;
    	case DisplayMetrics.DENSITY_MEDIUM: //MDPI
    		text5.setText("mediana Densidad");
    		scaleDensity = scale * 160;
    		pixelBoton = dips * (scaleDensity / 160);
    		break;
    		
    	case DisplayMetrics.DENSITY_LOW:  //LDPI
    		text5.setText("baja Densidad");
    		scaleDensity = scale * 120;
    		pixelBoton = dips * (scaleDensity / 120);
    		break;
    	}
    	Log.d(getClass().getSimpleName(), "pixels:"+Float.toString(pixelBoton));
    	
    	

    	
        
        
    }
}

y una forma más directa de descubrir lo mismo con TypedValue:

Resources resources = getResources();
Int dips = 200;
float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dips, resourses.getDisplayMetrics());



Gracias por comentar este post por si lo quieren aplicar en ejemplos precisos.

[UPDATE]
Pueden descargar el proyecto actualizado a Android 4.0, con resoluciones de pantalla para el Nexus 7 y XXHdpi ( Samsung s4, Htc One, Xperia Z ).
ResolucionTest.zip
Y aquí les dejo el APK generado por este proyecto:
ResolutionTest.apk

papachan

papachan

Consultor IT y desarollador Java de aplicaciones Móviles sobre la plataforma Android, actualmente reside en Bogota Colombia. Con una experiencia en desarrollo internet de +10 años, se ha involucrado como desarollador senior en varias empresas de desarrollos y servicios en Internet. Ahora es desarrollador Android en Tappsi.co
papachan
papachan

About papachan

Consultor IT y desarollador Java de aplicaciones Móviles sobre la plataforma Android, actualmente reside en Bogota Colombia. Con una experiencia en desarrollo internet de +10 años, se ha involucrado como desarollador senior en varias empresas de desarrollos y servicios en Internet. Ahora es desarrollador Android en Tappsi.co
This entry was posted in Android and tagged , , . Bookmark the permalink.

20 Respuestas a “Como obtener la resolución de pantalla y densidad en Aplicaciones Android”

  1. finuka dice:

    Muchisimas gracias por el post, me ha sido de gran ayuda. Llevaba un par de días

  2. lolo dice:

    me encanta el articulo, superpráctico. Pero hay alguna forma de pasar la densidad a pixeles, y eso a cm? por ejemplo, sacar una foto a un árbol, y obtener su medida en cm? Un saludo.

  3. JxDarkAngel dice:

    Gracias por la info. Llego la hora de hacer pruebas. De verdad muchas gracias!! Por cierto una pregunta, ¿Como puedo crear controles en tiempo de ejecución?. Mi idea es crear un examen con “N” cantidad de preguntas, cada pregunta con sus respectivas respuestas (Si, No, Tal vez, Nada que ver).

    Solo el administrador podra crear el examen, para que cuando entre un alumno pueda ver su examen con sus respectivas preguntas.

    Alguna sugerencia?

    • papachan dice:

      Crear controles, se puede sin nombrarlos en tu layout XML. Necesitaria el Id de un contenedor, y los creas directemente desde el código Java, buscando en el API de Android vas a ver que estan los controles que uno necesita mostrar.

  4. Daniel dice:

    Oye me podrías ayudar es que nose como ajustar una imagen a las pantallas, la imagen es mas grande que los dispositivos necesito ayuda me estoy volviendo loco, gracias

    • papachan dice:

      Si no podes usar las métricas en dip para tu imagen, y que la imagen no a parece desde la carpeta asociada a la resolución de tu dispositivo. Te sugiero entonces usar un layout xml que tenga un contenedor con esta imagen.

  5. David dice:

    El tamaño de la pantalla (Small, normal, large y Xlarge) se calcula con la resolucion de la imagen o con la diagonal de la pantalla en pulgadas? Mi jefe me ha encargado hacer una tabla de comparacion de Screen size y Densidad de la pantalla para crear una aplicacion.

    • papachan dice:

      Por lo general la diagonal en pulgadas es el tamaño de la pantalla del dispositivo, pero no permite realmente medir la densidad y la real resolucion de las imagenes que vas a usar. Fijate si podes descargar el ejemplo, ahi puse una imagen para Nexus7 y no corresponde exactamente a la resolución que nos daria el dispositivo si confiariamos en las caracteristica de cada dispositivo.

      Aqui podes mirar estas dos comparaciones:
      http://developer.android.com/images/screens_support/screens-ranges.png

  6. David dice:

    Osea que a la hora de hacer una aplicacion Android para que se pueda ver bien en todos los dispositivos unicamente tenemos que centrarnos en los parametros del tamaño de la pantalla y la DPI (densidad de la pantalla) no??

    Si he entendido bien la Densidad de la pantalla esta estrechamente relacionada con la resolucion.

    • papachan dice:

      No. esto es solo cuando tienes gráficos que estan en plena pantalla. La mayoría de los casos todo se maneja con DIP con los componentes (UIs) y con los layout:width y layout:height para ajustarse a los contenedores.

  7. Carlos dice:

    como hacer que mi aplicacion se pueda ver en cualquier pantalla de dispositivo android

    • papachan dice:

      Podes trabajar con differentes layouts en carpetas para diferentes resoluciones y aplicas unidades de medida como SP ( scale independent pixels ) o DP (Density Independent Pixels) a tus componentes.

  8. carlos dice:

    hola tengo un samsung galaxy fame y tengo todos los requisitos para jugar al pokerstars mobile pero la resolucion mia es de 480 x 320 y no me alcanza hay alguna forma de poder bajarlo con esta resolucion o de cambiarla?

  9. Neimy Avila dice:

    Una duda no ahí alguna forma para hacer genérica la aplicación es decir que con cual dispositivo se acomode a la resolución de su pantalla??

    Disculpa soy nueva en esto y no se mucho al respecto

    • papachan dice:

      Hola neimy, es una muy buena pregunta. siempre es indispensable generar lo minimo de layouts para su aplicacion, sin tener que complicarse mucho al momento de hacer cambios. luego cuando ya estas bien avanzado con la aplicacion alli se decide si se genera una carpeta para cada resolucion.

      dentro de su vista es importante usar layouts que se adapten a las diferentes resoluciones se puede usar luego unidades como “sp” para tomar en cuenta las altas resoluciones de algunas dispositivos moviles.

  10. David Valencia dice:

    Hola, una duda…

    Como se yo desde el código que carpeta de layouts se va a utilizar?

    Es que ejecuto la app y me dice “Layouts Para: …” pero no veo en que parte del código se este haciendo esa parte.

    Gracias…

  11. Evan Uriel dice:

    Esto ayudaría para poder tener por ejemplo la altura real de un objeto a través de una imagen tomada con la cámara?…

  12. Ivan dice:

    Hola para aumentar la densidad dpi de una imagen como podría lograrlo

Deja un comentario

  • Facebook AndroidCol