online - que es el dp en android
¿Cómo determinar el ancho de la pantalla en términos de dp o dip en tiempo de ejecución en Android? (6)
¿Qué hay de usar esto en su lugar?
final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;
Necesito codificar el diseño de los widgets de Android usando dip / dp (en archivos java). En tiempo de ejecución si codigo,
int pixel=this.getWindowManager().getDefaultDisplay().getWidth()
;
esto devuelve el ancho de la pantalla en píxeles (px). Para convertir esto a dp, codifiqué:
int dp =pixel/(int)getResources().getDisplayMetrics().density ;
Esto no parece ser una respuesta correcta. Hice el emulador de WVGA800 cuya resolución de pantalla es de 480 por 800. Cuando ejecuta el emulador y deja que el código imprima los valores de píxel y dp, llegó a 320 en ambos. Este emulador es de 240 ppp, cuyo factor de escala sería 0,75.
Me encontré con esta pregunta de Google, y más tarde encontré una solución fácil válida para API> = 13.
Para futuras referencias:
Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.
Ver referencia de clase de configuración
Editar: Como señaló Nick Baicoianu, esto devuelve el ancho / alto útil de la pantalla (que deberían ser los más interesantes en la mayoría de los usos). Si necesita las dimensiones de visualización reales , adhiérase a la respuesta superior.
Prueba esto
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);
float density = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth = outMetrics.widthPixels / density;
O
Gracias @ Tomáš Hubálek
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
Su problema es arrojar el flotador a un int, perdiendo precisión. También deberías multiplicar con el factor y no dividir.
Hacer esto:
int dp = (int)(pixel*getResources().getDisplayMetrics().density);
Te falta el valor de densidad predeterminado de 160.
2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
3 px = 2 dip if dpi == 240(hdpi), 840x480 screen
En otras palabras, si diseña su diseño con ancho igual a 160 dips en modo vertical, será la mitad de la pantalla en todos los dispositivos ldpi / mdpi / hdpi (excepto en las tabletas, creo)
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;
int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;
int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;
int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;