Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android get screen size of the other screen orientation

since android 3.0 there is a navigation bar with back and home button on the display. Now if I get the screen size like this

ClockLwp.ScreenHeight = getWindowManager().getDefaultDisplay().getHeight();
ClockLwp.ScreenWidth = getWindowManager().getDefaultDisplay().getWidth();

of this

getResources().getDisplayMetrics().widthPixels
getResources().getDisplayMetrics().heightPixels

I get different values for the landscape and portrait. Here is an example what I mean:

Acer Iconia A500 portrait mode : 800 x 1232 Acer Iconia A500 landscape mode : 1280 x 752

AFAIK this goes for all devices with such a navigation bar. (e.g. Samsung Galaxy Nexus, GalaxyTab 10.1 etc.)

Now my question is, if I am in portrait mode how can I get the values of landscape mode and the other way around?

like image 406
Xazen Avatar asked Feb 21 '12 16:02

Xazen


People also ask

How do I manage different screen sizes and orientations in Android?

The best way to create a responsive layout is to use ConstraintLayout as the base layout in your UI. ConstraintLayout enables you to specify the position and size of each view according to spatial relationships with other views in the layout. All the views can then move and resize together as the screen size changes.

How can we detect the orientation of the screen in Android?

int orientation = display. getOrientation(); Check orientation as your way and use this to change orientation: setRequestedOrientation (ActivityInfo.

How can I globally Force screen orientation in Android?

The answer is that you cannot globally set orientation. Any app can choose to handle orientation itself, and if it does so then it can choose to ignore changes to the device's orientation, or to change orientation based on its own criteria.


2 Answers

since android 3 there is no way with the public api to retrive the raw heigth and width . You can go through reflection. Look for getRawHeigth/Width

like image 123
Blackbelt Avatar answered Sep 29 '22 11:09

Blackbelt


EDIT (26 September 2014): I reformulated my text to contain a full answer and not just comment to Dmitri solution.

Here is the part that we are using to calculate the navigation bar height before rotation:

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

/* 
 * We need to take system resources here to verify navigation 
 * bar height. Application resources also contains navigation bar 
 * height but this value is not valid for some devices e.g. Nexus 7 (2012)! 
 */
Resources appRes = getResources();
Resources sysRes = Resources.getSystem();
boolean landscapeMode = (metrics.widthPixels > metrics.heightPixels);
/* Check if the device has navigation bar. There is no direct API for 
 * that so we use some hacking that may not always work,
 * (see http://stackoverflow.com/questions/16092431/check-for-navigation-bar)
 * but this method should be enough for most devices.
 * TODO: Find a more consistent way. For our needs it is currently enough as we 
 * support limited set of devices.
 */
boolean hasNavigationBar = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
int navBarHeight = 0;
int navBarHeightRotated = 0;
if (hasNavigationBar) {
    int barHeightDimId = 0;
    int barHeightDimIdRotated = 0;
    if (landscapeMode) {
        barHeightDimId = sysRes.getIdentifier(
                "navigation_bar_height_landscape", "dimen", "android");
        barHeightDimIdRotated = sysRes.getIdentifier(
                "navigation_bar_height", "dimen", "android");
    } else {
        barHeightDimIdRotated = sysRes.getIdentifier(
                "navigation_bar_height_landscape", "dimen", "android");
        barHeightDimId = sysRes.getIdentifier("navigation_bar_height",
                "dimen", "android");
    }
    if (barHeightDimId != 0) {
        navBarHeight = appRes.getDimensionPixelSize(barHeightDimId);
    }
    if (barHeightDimIdRotated != 0) {
        navBarHeightRotated = appRes
                .getDimensionPixelSize(barHeightDimIdRotated);
    }
    NCLogs.i("MyApp", String.format("Android navigation bar height: %d (current), %d (after rotation)", navBarHeight, navBarHeightRotated));
}

then we can calculate our view width and height after rotation:

int realScreenHeight = metrics.heightPixels + navBarHeight;

// We expect to not have decor views near the left or right borders
int realScreenWidth = metrics.widthPixels;

/*
 * Height of decor views: system status bar + any application addtional elements + 
 * + system navigation bar
 */
int decorHeightRotated = realScreenHeight - getHeight() - navBarHeight + navBarHeightRotated; 

int viewWidthRotated = realScreenHeight;
int viewHeightRotated = (realScreenWidth - decorHeightRotated);
NCLogs.i("MyApp", String.format("Width after rotation: %d, Height after rotation: %d", viewWidthRotated, viewHeightRotated));
like image 40
Piotr Ozieblo Avatar answered Sep 29 '22 13:09

Piotr Ozieblo