que online entre diferencias android dip

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;