2011-11-28 20 views
87

Quiero calcular dp desde px mediante programación. ¿Cómo hacerlo? consigo la resolución de:Cómo calcular dp desde píxeles en Android programáticamente

DisplayMetrics displaymetrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
ht = displaymetrics.heightPixels; 
wt = displaymetrics.widthPixels; 
+0

¿Usted sabe la dimensión física de la pantalla? 7 "en el diámetro, por ejemplo. –

+1

Es molesto cuando está marcado como un duplicado, pero no hay un enlace al duplicado adjunto a la notificación duplicada. –

Respuesta

32

Esto debe darle la conversión de píxeles -> DP:

DisplayMetrics displaymetrics = new DisplayMetrics(); 
int dp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, myPixels, displaymetrics); 
+29

** Lo que está haciendo es una conversión dp-> px. ** [La documentos para 'TypedValue.applyDimension'] (http://developer.android.com/reference/android/util/TypedValue.html#applyDimension%28int,%20float,%20android.util.DisplayMetrics%29) dicen que el primer argumento es la unidad para convertir _de_, y el valor de retorno es el "valor de coma flotante complejo multiplicado por las medidas apropiadas según su unidad". 'applyDimension' no se puede usar para convertir px-> dp, para eso debes hacerlo como se describe aquí: http://stackoverflow.com/a/17880012/504611 –

+1

¡divertido! Aunque no es la respuesta real, pero sigue siendo útil –

1
DisplayMetrics dm = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(dm); 
     String str_ScreenSize = "The Android Screen is: " 
        + dm.widthPixels 
        + " x " 
        + dm.heightPixels; 

     TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize); 
     mScreenSize.setText(str_ScreenSize); 

puede u cheeck a cabo ..

o esto también puede ayudar u

int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
        (float) 123.4, getResources().getDisplayMetrics()); 
51
float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ht, getResources().getDisplayMetrics()); 
float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, wt, getResources().getDisplayMetrics()); 
+17

La pregunta es sobre "px -> dp", pero el código parece "dp -> px "?? (tenga en cuenta el sufijo '_px' en LHS) – Palani

+0

Esto es una estafa vertiendo el camino opuesto a la pregunta. –

+0

de cualquier manera puede cambiar el primer parámetro a 'TypedValue.COMPLEX_UNIT_PX' de' TypedValue.COMPLEX_UNIT_DIP' para convertir 'dp-> px' – DeltaCap

243

Todas las respuestas aquí muestran una conversión dp-> px en lugar de PX> dp, que es lo que pidió el PO. Tenga en cuenta que TypedValue.applyDimension no se puede usar para convertir px-> dp, para eso debe usar el método descrito aquí: https://stackoverflow.com/a/17880012/504611 (se cita a continuación para mayor comodidad).

sin contexto, los métodos estáticos elegantes:

public static int dpToPx(int dp) 
{ 
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density); 
} 

public static int pxToDp(int px) 
{ 
    return (int) (px/Resources.getSystem().getDisplayMetrics().density); 
} 
+30

Esta debería ser la respuesta aceptada – Goldorak84

+0

es definitivamente la mejor respuesta que encontré sobre este problema. Se puede usar en todas las clases. – user3290180

+0

Esta es la respuesta correcta: devuelve px/(context.getResources(). GetDisplayMetrics(). DensityDpi/160f) –

Cuestiones relacionadas