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 xml

Answers


In a view:

DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
float dp = 20f;
float fpixels = metrics.density * dp;
int pixels = (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:

DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
float dp = 20f;
float fpixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
int pixels = 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.


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


Need Your Help

What is fastest way to convert bool to byte?

c#

What is fastest way to convert bool to byte?

WCF WebService / IIS Hosting & Configuration Issue Behind a Firewall

wcf web-services iis .net-3.5 configuration

I have a simple WCF Web service. It's hosted on IIS under the default website in our production domain. (local address: 10.10.20.100)