【问题标题】:Android DisplayMetrics display absolute size varies with orientationAndroid DisplayMetrics 显示绝对大小随方向变化
【发布时间】:2015-05-11 18:16:41
【问题描述】:

有没有人注意到这个问题并解决了在两个方向上一致地获得绝对显示尺寸的方法?

例如,Nexus 5 (5.0.1):

  • 纵向:宽度 = 1080 高度 = 1776
  • 横向:宽度 = 1794 高度 = 1080

我原以为纵向的高度会与横向的宽度相匹配。最初怀疑状态栏,但docs 都清楚了。无论如何,此示例中的状态栏高度在任一方向均为 75px,示例中的差异为 18px。

显示宽度和高度(以像素为单位)的代码 sn-p:

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
int width = displaymetrics.widthPixels;

String dimensions = String.format("width = %d height = %d", width, height);
Log.v(TAG, dimensions);

【问题讨论】:

    标签: android screen-size


    【解决方案1】:

    根据您的记录,假设显示器是全高清的,那么纵向的高度为 144 像素 (48dp),横向的宽度为 126 像素 (42dp)(当缩放因子为 3 时,即 xxhdpi)。我敢打赌这是导航栏,带有返回、主页和最近按钮。这足以选择布局。

    编辑:

    如果您需要完整的显示尺寸,API 17 提供以下代码:

    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    if (Build.VERSION.SDK_INT >= 17) {
        display.getRealSize(size);
    } else {
        display.getSize(size); // correct for devices with hardware navigation buttons
    }
    

    编辑2:

    如果您想确保在 API 14 到 16 上获得正确的结果,请考虑遵循此答案及其 cmets https://stackoverflow.com/a/11004877/2444099.

    【讨论】:

    • getRealSize() 类似于用于具有软导航栏的设备的 API。 getSize() 将与问题中的示例具有相同的效果。好收获@Eugen
    • 正确。但它在 API 17 以下不可用。在 API 10 之前没有软键,所以getSize() 可以。几乎没有 API 11 到 API 13 设备,所以可以说getSize() 也可以。对于 API 14 到 16,您需要使用反射来获取实际大小。
    【解决方案2】:

    这不是整个屏幕的大小,而是显示指标为您提供的 UI 的大小。您必须考虑状态栏(时钟、电池电量、信号强度栏)所占据的区域所占据的屏幕大小,这会因方向而异。

    【讨论】:

    • 安德鲁,我怀疑同样的事情,但是measured status bar height 在两个方向上都是相同的。很抱歉与操作栏混淆,我指的是我的问题中的状态栏 - 现在已更正。
    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多