Convert dip to px in Android

59,033

Solution 1

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...

Solution 2

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)

Solution 3

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

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

It's easier...

Solution 4

Try this for without passing context:

 public static float dipToPixels(float dipValue) {
     return TypedValue.applyDimension(
         TypedValue.COMPLEX_UNIT_DIP,
         dipValue,
         Resources.getSystem().getDisplayMetrics()
     );
 }
Share:
59,033
user961524
Author by

user961524

8 years of experience as a Software Engineer in Developing java j2ee applications, Mobile Applications, Web services, sql, plsql, AWS and cloud foundry.

Updated on July 09, 2022

Comments

  • user961524
    user961524 almost 2 years

    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;
    }
    
  • hjchin
    hjchin about 8 years
    what would you return float for pixel? Shouldn't it be casted to int?
  • Mercury
    Mercury over 7 years
    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