una tamaño studio soporte sizes resolución para pantallas pantalla multiples layouts diseño diferentes cómo aplicación aplicacion ajustar adaptar android dpi screen-density

tamaño - Obteniendo la densidad de la pantalla programáticamente en Android?



tamaño de pantalla android (16)

Aquí están las constantes de densidad, DisplayMetrics :

Existen, además de las densidades estándar, 5 intermedias. Teniendo en cuenta este hecho, el siguiente código será un ejemplo de trabajo completo:

float density = getResources().getDisplayMetrics().density; if (density == 0.75f) { // LDPI } else if (density >= 1.0f && density < 1.5f) { // MDPI } else if (density == 1.5f) { // HDPI } else if (density > 1.5f && density <= 2.0f) { // XHDPI } else if (density > 2.0f && density <= 3.0f) { // XXHDPI } else { // XXXHDPI }

Alternativamente usando el método densityDpi :

int densityDpi = getResources().getDisplayMetrics().densityDpi; switch (densityDpi) { case DisplayMetrics.DENSITY_LOW: // LDPI break; case DisplayMetrics.DENSITY_MEDIUM: // MDPI break; case DisplayMetrics.DENSITY_TV: case DisplayMetrics.DENSITY_HIGH: // HDPI break; case DisplayMetrics.DENSITY_XHIGH: case DisplayMetrics.DENSITY_280: // XHDPI break; case DisplayMetrics.DENSITY_XXHIGH: case DisplayMetrics.DENSITY_360: case DisplayMetrics.DENSITY_400: case DisplayMetrics.DENSITY_420: // XXHDPI break; case DisplayMetrics.DENSITY_XXXHIGH: case DisplayMetrics.DENSITY_560: // XXXHDPI break; }

¿Cómo obtener la densidad de la pantalla programáticamente en Android?

Quiero decir: ¿Cómo encontrar la pantalla dpi del dispositivo actual?


En realidad, si desea tener una resolución real de ppp, la respuesta está en un punto intermedio si consulta las métricas de visualización:

DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int dpiClassification = dm.densityDpi; float xDpi = dm.xdpi; float yDpi = dm.ydpi;

densityDpi * 160 le dará los valores / sugerencias de la densidad que debe usar

0.75 - ldpi - 120 dpi 1.0 - mdpi - 160 dpi 1.5 - hdpi - 240 dpi 2.0 - xhdpi - 320 dpi 3.0 - xxhdpi - 480 dpi 4.0 - xxxhdpi - 640 dpi

como se especifica en posts anteriores

pero dm.xdpi no le dará siempre los ppp dm.xdpi de la pantalla dada: Ejemplo:

Device: Sony ericsson xperia mini pro (SK17i) Density: 1.0 (e.g. suggests you use 160dpi resources) xdpi: 193.5238 Real device ppi is arround 193ppi Device: samsung GT-I8160 (Samsung ace 2) Density 1.5 (e.g. suggests you use 240dpi resources) xdpi 160.42105 Real device ppi is arround 246ppi

Entonces, tal vez los dpi reales de la pantalla deberían ser Density * xdpi .. ¡pero no estoy seguro de si esta es la forma correcta de hacerlo!


Esto debería ayudar en su actividad ...

void printSecreenInfo(){ Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); Log.i(TAG, "density :" + metrics.density); // density interms of dpi Log.i(TAG, "D density :" + metrics.densityDpi); // horizontal pixel resolution Log.i(TAG, "width pix :" + metrics.widthPixels); // actual horizontal dpi Log.i(TAG, "xdpi :" + metrics.xdpi); // actual vertical dpi Log.i(TAG, "ydpi :" + metrics.ydpi); }

SALIDA:

I/test( 1044): density :1.0 I/test( 1044): D density :160 I/test( 1044): width pix :800 I/test( 1044): xdpi :160.0 I/test( 1044): ydpi :160.42105


Esto debería funcionar.

DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; //320 int height = dm.heightPixels; //480


Esto también funciona:

getResources().getDisplayMetrics().density;

Esto te dará:

0.75 - ldpi

1.0 - mdpi

1.5 - hdpi

2.0 - xhdpi

3.0 - xxhdpi

4.0 - xxxhdpi

ref: densidad


La siguiente respuesta es una pequeña mejora basada en la respuesta de qwertzguy.

double density = getResources().getDisplayMetrics().density; if (density >= 4.0) { //"xxxhdpi"; } else if (density >= 3.0 && density < 4.0) { //xxhdpi } else if (density >= 2.0) { //xhdpi } else if (density >= 1.5 && density < 2.0) { //hdpi } else if (density >= 1.0 && density < 1.5) { //mdpi }


Otra respuesta más:

/** * @return "ldpi", "mdpi", "hdpi", "xhdpi", "xhdpi", "xxhdpi", "xxxhdpi", "tvdpi", or "unknown". */ public static String getDensityBucket(Resources resources) { switch (resources.getDisplayMetrics().densityDpi) { case DisplayMetrics.DENSITY_LOW: return "ldpi"; case DisplayMetrics.DENSITY_MEDIUM: return "mdpi"; case DisplayMetrics.DENSITY_HIGH: return "hdpi"; case DisplayMetrics.DENSITY_XHIGH: return "xhdpi"; case DisplayMetrics.DENSITY_XXHIGH: return "xxhdpi"; case DisplayMetrics.DENSITY_XXXHIGH: return "xxxhdpi"; case DisplayMetrics.DENSITY_TV: return "tvdpi"; default: return "unknown"; } }


Para obtener dpi:

DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); // will either be DENSITY_LOW, DENSITY_MEDIUM or DENSITY_HIGH int dpiClassification = dm.densityDpi; // these will return the actual dpi horizontally and vertically float xDpi = dm.xdpi; float yDpi = dm.ydpi;


Prueba esto...

En kotlin

fun determineScreenDensityCode(): String { return when (resources.displayMetrics.densityDpi) { DisplayMetrics.DENSITY_LOW -> "ldpi" DisplayMetrics.DENSITY_MEDIUM -> "mdpi" DisplayMetrics.DENSITY_HIGH -> "hdpi" DisplayMetrics.DENSITY_XHIGH, DisplayMetrics.DENSITY_280 -> "xhdpi" DisplayMetrics.DENSITY_XXHIGH, DisplayMetrics.DENSITY_360, DisplayMetrics.DENSITY_400, DisplayMetrics.DENSITY_420 -> "xxhdpi" DisplayMetrics.DENSITY_XXXHIGH, DisplayMetrics.DENSITY_560 -> "xxxhdpi" else -> "Unknown code ${resources.displayMetrics.densityDpi}" } }

Puede llamar por println("density: ${determineScreenDensityCode()}") y la salida será System.out: density: xxxhdpi


Prueba esto:

DisplayMetrics dm = context.getResources().getDisplayMetrics(); int densityDpi = dm.densityDpi;


Puede obtener información en la pantalla de la estructura DisplayMetrics :

DisplayMetrics metrics = getResources().getDisplayMetrics();

Aunque Android no utiliza un mapeo directo de píxeles, utiliza un puñado de valores cuantificados de píxeles independientes de densidad y luego se adapta al tamaño real de la pantalla. Por lo tanto, la propiedad metrics.densityDpi será una de las constantes DENSITY_xxx ( 120 , 160 , 213 , 240 , 320 , 480 o 640 dpi).

Si necesita la densidad real de píxeles lcd (quizás para una aplicación OpenGL), puede obtenerla de las propiedades metrics.xdpi y metrics.ydpi para la densidad horizontal y vertical respectivamente.

Si está apuntando a niveles de API anteriores a 4. La propiedad metrics.density es un factor de escala de punto flotante de la densidad de referencia (160 ppp). El mismo valor ahora proporcionado por metrics.densityDpi se puede calcular

int densityDpi = (int)(metrics.density * 160f);


Si desea recuperar la densidad de un Servicio, funciona así:

WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics metrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(metrics);


Usted debe intentar esto. Acaba de agregar un método que encontrará y mostrará la tostada. Eso en qué categoría cae el dispositivo.

public static int differentDensityAndScreenSize(Context context) { int value = 20; String str = ""; if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) { switch (context.getResources().getDisplayMetrics().densityDpi) { case DisplayMetrics.DENSITY_LOW: str = "small-ldpi"; value = 20; break; case DisplayMetrics.DENSITY_MEDIUM: str = "small-mdpi"; value = 20; break; case DisplayMetrics.DENSITY_HIGH: str = "small-hdpi"; value = 20; break; case DisplayMetrics.DENSITY_XHIGH: str = "small-xhdpi"; value = 20; break; case DisplayMetrics.DENSITY_XXHIGH: str = "small-xxhdpi"; value = 20; break; case DisplayMetrics.DENSITY_XXXHIGH: str = "small-xxxhdpi"; value = 20; break; case DisplayMetrics.DENSITY_TV: str = "small-tvdpi"; value = 20; break; default: str = "small-unknown"; value = 20; break; } } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) { switch (context.getResources().getDisplayMetrics().densityDpi) { case DisplayMetrics.DENSITY_LOW: str = "normal-ldpi"; value = 82; break; case DisplayMetrics.DENSITY_MEDIUM: str = "normal-mdpi"; value = 82; break; case DisplayMetrics.DENSITY_HIGH: str = "normal-hdpi"; value = 82; break; case DisplayMetrics.DENSITY_XHIGH: str = "normal-xhdpi"; value = 90; break; case DisplayMetrics.DENSITY_XXHIGH: str = "normal-xxhdpi"; value = 96; break; case DisplayMetrics.DENSITY_XXXHIGH: str = "normal-xxxhdpi"; value = 96; break; case DisplayMetrics.DENSITY_TV: str = "normal-tvdpi"; value = 96; break; default: str = "normal-unknown"; value = 82; break; } } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) { switch (context.getResources().getDisplayMetrics().densityDpi) { case DisplayMetrics.DENSITY_LOW: str = "large-ldpi"; value = 78; break; case DisplayMetrics.DENSITY_MEDIUM: str = "large-mdpi"; value = 78; break; case DisplayMetrics.DENSITY_HIGH: str = "large-hdpi"; value = 78; break; case DisplayMetrics.DENSITY_XHIGH: str = "large-xhdpi"; value = 125; break; case DisplayMetrics.DENSITY_XXHIGH: str = "large-xxhdpi"; value = 125; break; case DisplayMetrics.DENSITY_XXXHIGH: str = "large-xxxhdpi"; value = 125; break; case DisplayMetrics.DENSITY_TV: str = "large-tvdpi"; value = 125; break; default: str = "large-unknown"; value = 78; break; } } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) { switch (context.getResources().getDisplayMetrics().densityDpi) { case DisplayMetrics.DENSITY_LOW: str = "xlarge-ldpi"; value = 125; break; case DisplayMetrics.DENSITY_MEDIUM: str = "xlarge-mdpi"; value = 125; break; case DisplayMetrics.DENSITY_HIGH: str = "xlarge-hdpi"; value = 125; break; case DisplayMetrics.DENSITY_XHIGH: str = "xlarge-xhdpi"; value = 125; break; case DisplayMetrics.DENSITY_XXHIGH: str = "xlarge-xxhdpi"; value = 125; break; case DisplayMetrics.DENSITY_XXXHIGH: str = "xlarge-xxxhdpi"; value = 125; break; case DisplayMetrics.DENSITY_TV: str = "xlarge-tvdpi"; value = 125; break; default: str = "xlarge-unknown"; value = 125; break; } } // The Toast will show the Device falls in Which Categories. Toast.makeText(MainActivity.this, ""+str, Toast.LENGTH_SHORT).show(); return value; }

http://www.androidwarriors.com/2016/01/how-to-find-different-devices-screen.html


respuesta como método auxiliar estático:

private static String getDensityName(Context context) { float density = context.getResources().getDisplayMetrics().density; if (density >= 4.0) { return "xxxhdpi"; } if (density >= 3.0) { return "xxhdpi"; } if (density >= 2.0) { return "xhdpi"; } if (density >= 1.5) { return "hdpi"; } if (density >= 1.0) { return "mdpi"; } return "ldpi"; }


DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); switch(metrics.densityDpi) { case DisplayMetrics.DENSITY_LOW: break; case DisplayMetrics.DENSITY_MEDIUM: break; case DisplayMetrics.DENSITY_HIGH: break; }

Esto funcionará en API nivel 4 y superior.


public static String getDensity(Context context) { String r; DisplayMetrics metrics = new DisplayMetrics(); if (!(context instanceof Activity)) { r = "hdpi"; } else { Activity activity = (Activity) context; activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); if (metrics.densityDpi <= DisplayMetrics.DENSITY_LOW) { r = "ldpi"; } else if (metrics.densityDpi <= DisplayMetrics.DENSITY_MEDIUM) { r = "mdpi"; } else { r = "hdpi"; } } return r; }