Android 获取屏幕高度

2023-12-20

Android 中如何获取屏幕的可用高度?我需要减去状态栏/菜单栏或屏幕上可能出现的任何其他装饰的高度,并且我需要它适用于所有设备。另外,我需要在 onCreate 函数中知道这一点。我知道这个问题之前已经被问过,但我已经尝试过他们的解决方案,但没有一个有效。以下是我尝试过的一些方法:

我已经在 API 7 - 17 上测试了这段代码。不幸的是,在 API 13 上,底部水平和垂直方向都有额外的空间,而在 API 10、8 和 7 上,底部水平和垂直方向都没有足够的空间。 (我还没有对过时的 API 进行测试):

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;

TypedValue tv = new TypedValue();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
        screenHeight -= TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
    screenHeight -= getResources().getDimensionPixelSize(resourceId);

这没有考虑状态栏/菜单栏:

Display display = getWindowManager().getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();

这也不:

Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
screenWidth = size.x;
screenHeight = size.y;

也不是这个:

Point size = new Point();
getWindowManager().getDefaultDisplay().getRealSize(size);
screenWidth = size.x;
screenHeight = size.y;

这不起作用:

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
// since SDK_INT = 1;
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
try
{
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    screenWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
    screenHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
}
catch (Exception ignored)
{
    // Do nothing
}
try
{
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
    screenWidth = realSize.x;
    screenHeight = realSize.y;
}
catch (Exception ignored)
{
    // Do nothing
}

然后,我使用以下代码从屏幕高度中减去状态栏和菜单栏的高度:

int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0)
    result = getResources().getDimensionPixelSize(resourceId);
screenHeight -= result;
result = 0;
if (screenHeight >= screenWidth)
    resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
else
    resourceId = getResources().getIdentifier("navigation_bar_height_landscape", "dimen", "android");
if (resourceId > 0)
    result = getResources().getDimensionPixelSize(resourceId);
screenHeight -= result;

在 API 17 上,它可以正确计算纵向状态栏和菜单栏的高度,但不能正确计算横向高度。在 API 10 上,它返回 0。我需要它在所有设备或最低 API 7 上都能理想地工作。


如果您想要以像素为单位的显示尺寸,您可以使用getSize http://developer.android.com/reference/android/view/Display.html#getSize%28android.graphics.Point%29:

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

如果您不在Activity您可以通过以下方式获取默认显示WINDOW_SERVICE:

WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
display.getSize(size);
int width = size.x;
int height = size.y;

Before getSize被引入(在 API 级别 13 中),您可以使用getWidth 和 getHeight 方法现已弃用:

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

引用自: 获取屏幕尺寸(以像素为单位) https://stackoverflow.com/questions/1016896/how-to-get-screen-dimensions

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 获取屏幕高度 的相关文章

随机推荐

  • 第一范式和时间数据

    第一个范式表示行顺序不重要 这是否意味着以日期作为键一部分的表不是 1NF 例如 考虑一个股票价格表 其中日期 时间是 PK 的一部分 在本例中 您可以通过按日期对数据进行排序并选择顶部的 1 行来获取最后的价格 这是否意味着为了满足 1N
  • 如何根据条件进行正则表达式匹配?

    我正在尝试制作一个条件正则表达式 我知道还有其他关于堆栈溢出的帖子 但问题太具体了 问题 如何创建一个仅在给定条件下匹配某些内容的正则表达式 一个例子 一个例子是 如果我们有一个字符串列表 这是在java中 String nums 42 3
  • WinRT:如何确保图像在画布上以像素完美的方式绘制?

    我正在添加Image http msdn microsoft com en us library windows apps windows ui xaml controls image aspx实例到Canvas http msdn mic
  • React/Redux 调度不触发减速器

    努力从我的 React 组件中调度一个操作 这是我的第一个 Redux 应用程序 一切似乎都工作正常 但如果是的话我就不会发布这个问题 我正在使用 Redux devTool 来调试我的应用程序 如果我使用 devTools 中的调度程序
  • 如何用Java制作一个简单的元音计数器方法?

    这是我的方法 public char ReturnAllVowels String word for int i 0 i lt word length i if word contains a e i o u 它说 不能应用于 String
  • Preg_match 到正则表达式等效表达式以匹配任何 Unicode 字母

    我被困在preg match vs regex 我正在尝试验证客户端的用户输入值 对于他们的名字和姓氏 我有这个表达方式 适合preg match p L s ui lt working fine with preg match 我需要 J
  • 我如何通过迁移的帮助将数据插入表中,并且该表是之前通过另一个迁移生成的

    我有一个包含用户名 角色和公司的角色表 我想通过新的迁移文件将数据插入到该表中 那么我该怎么做 我得到了这样的代码 但我如何使用它以及我无法理解的地方 class Foo lt ActiveRecord Migration def self
  • 为什么 EOF(文件结尾)在行尾没有 '\n' 之前不起作用?

    于是我开始用ANSI C的书来学习C 本书的早期练习之一是编写一个程序 该程序接受文本输入并在新行上打印每个单词 这很简单 所以我做了 include
  • 如何从 Visual Studio 中打开 TFS 中的单个变更集

    有人通过电子邮件给我发送了一个 TFS 变更集 ID 现在我正在尝试打开这个单个变更集 在 Visual Studio 中 VS 2008 如果重要的话 有一个简单的方法可以做到这一点吗 在 Visual Studio 中 键盘快捷键可用于
  • 在java中使用没有“循环”的标签

    我一直认为标签必须仅与循环一起使用 但似乎并非如此 给出这样的代码 public class LabelTest public static void main String args label1 System out println l
  • 鼠标放大算法(OpenGL)

    我有一个带有左上角坐标系的 OpenGL 场景 当我 glScale 时 它 从左上角的 0 0 放大 我希望它从鼠标坐标 相对于 OGL 框架 放大 这是怎么做到的 谢谢 我相信这可以通过四个步骤来完成 使用窗口系统 即 GLUT 或 S
  • 如果结果来得太晚,则限制但丢弃结果

    我正在编写一个用户界面 用户可以在其中输入搜索词 并且列表会不断更新以提供建议 我的第一反应是 Rx 原始 Throttle 是一个完美的匹配 但它让我成功了一半 这些建议需要一段时间才能获取 因此我在 UI 线程上异步获取它们 问题是 如
  • errno 值未更新 (c++)

    我是编码新手 目前正在学习 C 我了解一点 C 正在阅读 math h 中的函数并阅读 errno 根据我提到的网站 域错误 输入参数超出了运算的数学定义范围 例如 std sqrt 1 std log 1 或 std acos 2 如果设
  • 使用非原始参数进行参数化 JUnit 测试?

    很有可能使用参数运行 JUnit 测试 其中使用不同的数据多次执行相同的测试方法 如下所述 http junit org apidocs org junit runners Parameterized html http junit org
  • Spring可为空注释生成未知枚举常量警告

    在我的应用程序中 每当我添加 Nullable 从进口org springframework lang Nullable 到任何字段 我都会收到构建警告 警告 java 未知的枚举常量 javax annotation meta When
  • 将点添加到r中的3d图中

    我是 R 中 3D 绘图的初学者 我需要帮助 我尝试绘制一些简单的抛物面 library rgl x lt seq 1 1 0 2 y lt x f lt function x y x 2 y 2 z lt outer x y f pers
  • 如何在 Typescript 中使用 Ziggy 包

    所以我想创建一个使用 axios 检索数据的打字稿类 但我无法找到使用的方法route ziggy 在我的 Typescript 类中提供的函数 因为它不是 npm 包 我对 Node js 还是很陌生 任何帮助是极大的赞赏 import
  • 在 Python 中将列表项与大文件中的行进行匹配的最有效方法是什么?

    我有一个大文件 5Gb 名为my file 我有一个名为my list 读取文件中每一行的最有效方法是什么 如果来自my list匹配以下行中的项目my file 创建一个名为的新列表matches包含以下行中的项目my file以及来自的
  • docker 与 openshift 相比如何?

    Docker http www docker io and 开放式班次 https www openshift com 都是实现 PaaS 服务的框架 它们在架构和功能方面如何比较 主要区别在于 Docker 作为一个项目仅关注运行时容器
  • Android 获取屏幕高度

    Android 中如何获取屏幕的可用高度 我需要减去状态栏 菜单栏或屏幕上可能出现的任何其他装饰的高度 并且我需要它适用于所有设备 另外 我需要在 onCreate 函数中知道这一点 我知道这个问题之前已经被问过 但我已经尝试过他们的解决方