2011-12-06 13 views
46

Tenía un método escrito para obtener los píxeles de la inmersión, pero no está funcionando. Me da error de tiempo de ejecución.Convertir dip a px en Android

En realidad yo estaba corriendo este método en la clase separada e inicializado en mi clase Actividad

Board board = new Board(this); 
board.execute(URL); 

Este ejecutar código de forma asíncrona. Por favor, ayúdame.

public float getpixels(int dp){ 

     //Resources r = boardContext.getResources(); 
     //float px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpis, r.getDisplayMetrics()); 

     final float scale = this.boardContext.getResources().getDisplayMetrics().density; 
      int px = (int) (dp * scale + 0.5f); 



     return px; 

    } 
+0

¿Qué error obtienes? boardContext es nulo? getResources es nulo? – Sulthan

Respuesta

14

La fórmula es: px = dp * (dpi/160), por tener en un 160 dpi pantalla. Consulte http://developer.android.com/guide/practices/screens_support.html para obtener más información.

Usted podría intentar:

public static int convertDipToPixels(float dips) 
{ 
    return (int) (dips * appContext.getResources().getDisplayMetrics().density + 0.5f); 
} 

Espero que esto ayude ...

123

Prueba esto:

Java

public static float dipToPixels(Context context, float dipValue) { 
    DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, metrics); 
} 

Kotlin

fun Context.dipToPixels(dipValue: Float) = 
    TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, resources.displayMetrics) 
+5

¿qué devolverías flotar por píxel? ¿No debería ser lanzado a int? – hjchin

+0

Funciona, PERO parece que aplicando el w, h a mi actividad flotante, Android agrega 16dp a derecha e izquierda (total 32dp), allí para el dipValue que tuve que pasar está el dipValue que tenía en el diseño xml + 32dp - lo arreglé – Mercury

34

Usted puede agregar el valor dp en dimen.xml y utilizar

int pixels = getResources().getDimensionPixelSize(R.dimen.idDimension); 

Es más fácil ...

0

Pruebe esto: Para sin pasar el contexto

public static float dipToPixels(float dipValue) { 
     return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, Resources.getSystem().getDisplayMetrics()); 
    }