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

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

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

如何在主活动中获取screenWidthscreenHeight

答案

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

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

如果您不在Activity ,则可以通过WINDOW_SERVICE获取默认的Display

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

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

在引入getSize之前(在 API 级别 13 中),可以使用现已弃用的getWidthgetHeight方法:

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获取以下信息:

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

例:

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

一种方法是:

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

不建议使用它,而应尝试使用以下代码。前两行代码为您提供DisplayMetrics对象。该对象包含heightPixelswidthPixels类的字段。

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

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

它可能无法回答您的问题,但了解(当我遇到此问题时我自己也在寻找它)可能有用,如果您需要一个 View 的尺寸,但是在尚未布局其布局时正在执行您的代码(例如,在onCreate() ),您可以使用View.getViewTreeObserver().addOnGlobalLayoutListener()设置ViewTreeObserver.OnGlobalLayoutListener并将需要视图尺寸的相关代码放在此处。布局完成后,将调用侦听器的回调。

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

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();
}

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

我尝试了所有可能的 “解决方案” 均未成功,但我注意到 Elliott Hughes 的 “Dalvik Explorer” 应用在任何 Android 设备 / OS 版本上始终显示正确的尺寸。我最后看了看他的开源项目,可以在这里找到: 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) {
}

编辑:版本略有改进(避免在不受支持的 OS 版本上触发异常):

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) {
}

最简单的方法:

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

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

样例代码

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    result = getResources().getDimensionPixelSize(resId);
}

可变result给出像素的高度。

快速访问

在此处输入图片说明

有关Title barNavigation barContent View高度的更多信息,请查看Android 设备屏幕尺寸

首先获取视图(例如,通过findViewById() ),然后可以在视图本身上使用getWidth()

我有两个功能,一个用于发送上下文,另一个用于获取高度和宽度(以像素为单位):

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // Deprecated
    }
    return width;
}

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }
    else{
        height = display.getHeight();  // Deprecated
    }
    return height;
}

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

下面的示例根据 Synic 在该线程上的响应进行了修改 ,显示了一个按钮,该按钮占据了屏幕的 75%(权重 = .25),文本视图占据了屏幕的其余 25%(权重 = .75)。

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="somebutton">

    <TextView android:layout_width="fill_parent"
        android:layout_height="Wrap_content"
        android:layout_weight=".75">
</LinearLayout>