Android获取另一屏幕方向的屏幕尺寸

6

从 Android 3.0 开始,屏幕上有一个导航栏,包括返回和主页按钮。现在如果我想要获取屏幕尺寸:

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

of this

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

我在横屏和竖屏模式下获取的数值不同。以下是一个例子:

Acer Iconia A500 竖屏模式:800 x 1232 Acer Iconia A500 横屏模式:1280 x 752

据我所知,所有带有导航栏的设备都是如此(例如三星Galaxy Nexus、GalaxyTab 10.1等)。

现在我的问题是,如果我处于竖屏模式,如何获取横屏模式下的数值?反之亦然。

3个回答

1
自从Android 3以后,使用公共API无法直接获取原始的高度和宽度。你可以借助反射来实现。可以查找getRawHeight/Width方法。

我真正想要的不是原始高度和宽度。而是在减去导航栏高度后,另一方向上的宽度和高度值。 - Xazen
我不知道如何获取导航栏的高度。(包括返回和主页按钮,我不确定这个栏的正确称呼。) - Xazen
RawHeigth - Display.getHeight() 应该会给你状态栏的高度。 - Blackbelt
无法工作。在某些设备上,该栏位于屏幕右侧而不是底部。 - Frank

1

编辑(2014年9月26日):我重新表述了我的文字,包含完整的答案而不仅仅是对Dmitri解决方案的评论。

这是我们在旋转之前用来计算导航栏高度的部分:

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 https://dev59.com/VWQo5IYBdhLWcg3wZelg)
 * 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));
}

然后,我们可以在旋转后计算我们的视图宽度和高度:
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));

0

这是适用于我的解决方案。我获取了实际屏幕尺寸,然后减去了导航栏的高度。

    // get navigation bar height for landscape and portrait modes 
    Resources resources = activity.getResources();
    int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
    int resourceIdLandscape = resources.getIdentifier("navigation_bar_height_landscape", "dimen", "android");
    int portraitNavBarHeight = 0;
    int landscapeNavBarHeight = 0;

    boolean hasPermanentMenuKey = ViewConfiguration.get(activity).hasPermanentMenuKey();
    if (resourceId > 0 && !hasPermanentMenuKey) {
        portraitNavBarHeight = resources.getDimensionPixelSize(resourceId);
    }

    if (resourceIdLandscape > 0 && !hasPermanentMenuKey) {
        landscapeNavBarHeight = resources.getDimensionPixelSize(resourceIdLandscape);
    } 

    // get real screen size 
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
    Display disp = wm.getDefaultDisplay();

    int API_LEVEL =  android.os.Build.VERSION.SDK_INT;
    if (API_LEVEL >= 17) {
        disp.getRealMetrics(displayMetrics);
    } else {
        disp.getMetrics(displayMetrics);
    }

    int width = displayMetrics.widthPixels;
    int height = displayMetrics.heightPixels;

    // size for orientation 
    int portraitHeight;
    int portraitWidth;
    int landscapeHeight;
    int landscapeWidth;

    if(width > height) {
        portraitHeight = width - portraitNavBarHeight;
        portraitWidth = height;

        landscapeHeight = height - landscapeNavBarHeight;
        landscapeNavBarHeight = width;

    } else {
        portraitHeight = height - portraitNavBarHeight;
        portraitWidth = width;

        landscapeHeight = width - landscapeNavBarHeight;
        landscapeNavBarHeight = height;
    }

如果您的应用程序有状态栏
public static int getStatusBarHeight(Context context) {
    Resources resources = context.getResources();
    int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        return resources.getDimensionPixelSize(resourceId);
    }
    return 0;
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接