Formula px to dp, dp to px android Formula px to dp, dp to px android android android

Formula px to dp, dp to px android


Note: The widely used solution above is based on displayMetrics.density. However, the docs explain that this value is a rounded value, used with the screen 'buckets'. Eg. on my Nexus 10 it returns 2, where the real value would be 298dpi (real) / 160dpi (default) = 1.8625.

Depending on your requirements, you might need the exact transformation, which can be achieved like this:

[Edit] This is not meant to be mixed with Android's internal dp unit, as this is of course still based on the screen buckets. Use this where you want a unit that should render the same real size on different devices.

Convert dp to pixel:

public int dpToPx(int dp) {    DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();    return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));     }

Convert pixel to dp:

public int pxToDp(int px) {    DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();    return Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));}

Note that there are xdpi and ydpi properties, you might want to distinguish, but I can't imagine a sane display where these values differ greatly.


I solved my problem by using the following formulas. May other people benefit from it.

dp to px:

displayMetrics = context.getResources().getDisplayMetrics();return (int)((dp * displayMetrics.density) + 0.5);

px to dp:

displayMetrics = context.getResources().getDisplayMetrics();return (int) ((px/displayMetrics.density)+0.5);


Efficient way ever

DP to Pixel:

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

Pixel to DP:

private int pxToDp(int px){    return (int) (px / Resources.getSystem().getDisplayMetrics().density);}

Hope this will help you.