How to get screen dimensions as pixels in Android

android, dimensions, layout, pixel, screen

Solution

For API Level 30, `WindowMetrics.getBounds` is to be used. An example of its usage can be found in the linked docs:

 final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
 // Gets all excluding insets
 final WindowInsets windowInsets = metrics.getWindowInsets();
 Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()
         | WindowInsets.Type.displayCutout());

 int insetsWidth = insets.right + insets.left;
 int insetsHeight = insets.top + insets.bottom;

 // Legacy size that Display#getSize reports
 final Rect bounds = metrics.getBounds();
 final Size legacySize = new Size(bounds.width() - insetsWidth,
         bounds.height() - insetsHeight);

Old answer:

If you want the display dimensions in pixels you can use `getSize`:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

If you're not in an `Activity` you can get the default `Display` via `WINDOW_SERVICE`:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

If you are in a fragment and want to acomplish this just use Activity.WindowManager (in Xamarin.Android) or getActivity().getWindowManager() (in java).

Before `getSize` was introduced (in API level 13), you could use the `getWidth` and `getHeight` methods that are now deprecated:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated

For the use case, you're describing, however, a margin/padding in the layout seems more appropriate.

Another way is: DisplayMetrics

A structure describing general information about a display, such as its size, density, and font scaling. To access the DisplayMetrics members, initialize an object like this:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

We can use `widthPixels` to get information for:

"The absolute width of the display in pixels."

Example:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);

Problem

I created some custom elements, and I want to programmatically place them to the upper right corner (`n` pixels from the top edge and `m` pixels from the right edge). Therefore I need to get the screen width and screen height and then set position: ``` int px = screenWidth - m; int py = screenHeight - n; ``` How do I get `screenWidth` and `screenHeight` in the main Activity?

Original source

Related problems