Skip to content Skip to sidebar Skip to footer

Android Specifying Pixel Units (like Sp, Px, Dp) Without Using Xml

Is it possible to specify the pixel unit in code. What I mean is, say I have a layout and I want the size to be 20dp, then is there any way to do so without writing in a layout xm

Solution 1:

In a view:

DisplayMetricsmetrics= getContext().getResources().getDisplayMetrics();
floatdp=20f;
floatfpixels= metrics.density * dp;
intpixels= (int) (fpixels + 0.5f);

In an Activity, of course, you leave off the getContext().

To convert from scaled pixels (sp) to pixels, just use metrics.scaledDensity instead of metrics.density.

EDIT: As @Santosh's answer points out, you can do the same thing using the utility class TypedValue:

DisplayMetricsmetrics= getContext().getResources().getDisplayMetrics();
floatdp=20f;
floatfpixels= TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
intpixels= Math.round(fpixels);

For sp, substitute TypedValue.COMPLEX_UNIT_SP for TypedValue.COMPLEX_UNIT_DIP.

Internally, applyDimension() does exactly the same calculation as my code above. Which version to use is a matter of your coding style.

Solution 2:

You can use

float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics());

now, the value of pixels is equivalent to 20dp

The TypedValue contains other similar methods that help in conversion

Post a Comment for "Android Specifying Pixel Units (like Sp, Px, Dp) Without Using Xml"