53

I had written method to get the pixels from dip but it is not working. It give me runtime error.

Actually I was running this method in separate class and initialized in my Activity class

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

This code runs asynchronously. Please help me.

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;
}
hata
  • 11,633
  • 6
  • 46
  • 69
user961524
  • 537
  • 1
  • 7
  • 19

4 Answers4

140

Try this:

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)
Dmytro Danylyk
  • 19,684
  • 11
  • 62
  • 68
  • 6
    what would you return float for pixel? Shouldn't it be casted to int? – hjchin Mar 31 '16 at 04:33
  • Works, BUT seems that applying the w, h to my floating activity, android adds 16dp to right and left (total 32dp), there for the dipValue i had to pass is the dipValue i had in the layout xml + 32dp - fixed it – Mercury Mar 25 '17 at 19:35
43

You can add the dp value in dimen.xml and use

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

It's easier...

juancazalla
  • 1,050
  • 11
  • 17
23

The formula is: px = dp * (dpi / 160), for having on a 160 dpi screen. See Convert dp units to pixel units for more information.

You could try:

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

Hope this helps...

hata
  • 11,633
  • 6
  • 46
  • 69
oriolpons
  • 1,883
  • 12
  • 20
8

Try this for without passing context:

 public static float dipToPixels(float dipValue) {
     return TypedValue.applyDimension(
         TypedValue.COMPLEX_UNIT_DIP,
         dipValue,
         Resources.getSystem().getDisplayMetrics()
     );
 }
hata
  • 11,633
  • 6
  • 46
  • 69
Sumitkumar Dhule
  • 409
  • 5
  • 10