如何在Android中以像素为单位获取屏幕尺寸

问题描述 投票:1798回答:39

我创建了一些自定义元素,我想以编程方式将它们放置在右上角(顶部边缘n像素,右侧边缘m像素)。因此,我需要获取屏幕宽度和屏幕高度,然后设置位置:

int px = screenWidth - m;
int py = screenHeight - n;

如何在主要活动中获得screenWidthscreenHeight

android layout screen pixel dimensions
39个回答
3434
投票

如果要以像素为单位显示尺寸,可以使用getSize

getSize

如果您不在Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; 中,则可以通过Activity获得默认的Display

WINDOW_SERVICE

[如果您在一个片段中并且想要完成此操作,则只需使用Activity.WindowManager(在Xamarin.Android中)或getActivity()。getWindowManager()(在Java中)。

在引入WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); 之前(在API级别13中,您可以使用现在不推荐使用的getSizegetWidth方法:

getHeight

但是对于您正在描述的用例,布局中的边距/填充似乎更合适。

另一种方法是:Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); // deprecated int height = display.getHeight(); // deprecated

一种描述有关显示器的常规信息的结构,例如其大小,密度和字体缩放。要访问DisplayMetrics成员,请像这样初始化一个对象:

DisplayMetrics

我们可以使用DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); 获取以下信息:

“显示的绝对宽度,以像素为单位。”

示例:

widthPixels

17
投票

为了使用XML动态缩放,有一个名为“ android:layout_weight”的属性


17
投票

这是我用于任务的代码:


17
投票

这不是更好的解决方案吗? // `activity` is an instance of Activity class. Display display = activity.getWindowManager().getDefaultDisplay(); Point screen = new Point(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { display.getSize(screen); } else { screen.x = display.getWidth(); screen.y = display.getHeight(); } 包含您需要的所有内容,并且可以从API 1使用。


15
投票

只需添加Francesco的答案即可。如果您想找出窗口中的位置或屏幕中的位置,则另一个比较合适的观察者是getRealMetrics


15
投票

查找屏幕的宽度和高度:


14
投票

在活动中使用以下代码。


14
投票
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;

11
投票

我发现这可以解决问题。


11
投票

[需要说,如果您不在Rect dim = new Rect(); getWindowVisibleDisplayFrame(dim); 中,但是在Activity中(或在您的作用域中具有View类型的变量),则无需使用View。然后,您可以至少使用两种方式。


11
投票
DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);

364
投票

一种方法是:

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

已弃用,您应该尝试使用以下代码。代码的前两行为您提供Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); objecs。该对象包含DisplayMetricsheightPixels之类的字段。

widthPixels

10
投票

为了获得屏幕尺寸,请使用显示指标


8
投票

这不是OP的答案,因为他希望显示尺寸以实像素为单位。我想要“独立于设备的像素”中的尺寸,然后从此处int width =displayMetrics.widthPixels; int height =displayMetrics.heightPixels; 和此处https://stackoverflow.com/a/17880012/253938汇总答案,我想出了这一点:


7
投票

[使用DisplayMetrics(API 1)可以避免这种情况,这避免了try / catch混乱:


7
投票

我会像这样包装getSize代码:


7
投票

您可以使用:


5
投票

对于谁在没有状态栏


5
投票

首先加载XML文件,然后编写此代码:


5
投票

遵循以下方法:


4
投票

有时,在活动的onCreate中,您需要知道布局的可用空间的精确尺寸。经过一番思考,我想出了这样做的方法。


4
投票

如果不需要WindowManagers,Points或Displays的开销,则可以将XML中最顶部View项目的height和width属性,只要将其高度和宽度设置为match_parent即可。 (这是正确的,只要您的布局占据了整个屏幕。)


115
投票

它可能无法回答您的问题,但了解(当我遇到此问题时我一直在寻找它)可能很有用(如果您需要View的尺寸,但是在未放置其布局时执行代码)出来(例如在DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int height = metrics.heightPixels; int width = metrics.widthPixels; 中),您可以将onCreate()设置为ViewTreeObserver.OnGlobalLayoutListener,然后在其中放置需要视图尺寸的相关代码。布置好布局后,将调用侦听器的回调。


4
投票

科特琳


106
投票

((2012年的答案,可能已经过时),如果要支持Honeycomb之前的版本,则需要在API 13之前具有向后兼容性。类似:

View.getViewTreeObserver().addOnGlobalLayoutListener()

当然,不推荐使用的方法最终将从最新的SDK中删除,但是尽管我们仍然依赖大多数拥有Android 2.1、2.2和2.3的用户,但这是我们剩下的。


66
投票

我尝试了所有可能的“解决方案”均未成功,但我注意到Elliott Hughes的“ Dalvik Explorer”应用始终在任何Android设备/ OS版本上都显示正确的尺寸。我最终查看了他的开源项目,可以在这里找到:int measuredWidth = 0; int measuredHeight = 0; WindowManager w = getWindowManager(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { Point size = new Point(); w.getDefaultDisplay().getSize(size); measuredWidth = size.x; measuredHeight = size.y; } else { Display d = w.getDefaultDisplay(); measuredWidth = d.getWidth(); measuredHeight = d.getHeight(); }

这里是所有相关代码:

https://code.google.com/p/enh/

编辑:稍有改进的版本(避免在不受支持的操作系统版本上引发异常):

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

47
投票

最简单的方法:

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

46
投票

为了访问Android设备状态栏的高度,我们更喜欢以编程方式获取它:

样本代码

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 

变量int resId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resId > 0) { result = getResources().getDimensionPixelSize(resId); } 给出像素的高度。

用于快速访问

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8xSHhsTS5wbmcifQ==” alt =“在此处输入图像描述”>“ >>

有关resultTitle barNavigation bar的高度的更多信息,请查看Content View


32
投票

首先获取视图(例如,按Android Device Screen Sizes),然后可以在视图本身上使用findViewById()


27
投票

我有两个功能,一个用于发送上下文,另一个用于获取像素的高度和宽度:

© www.soinside.com 2019 - 2024. All rights reserved.