如何在Android中将屏幕尺寸作为像素获取

How to get screen dimensions as pixels in Android

提问人:Niko Gamulin 提问时间:6/19/2009 最后编辑:Samet ÖZTOPRAKNiko Gamulin 更新时间:8/30/2023 访问量:1229862

问:

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

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

我如何获得和进入主活动?screenWidthscreenHeight

Android 布局 屏幕 像素 尺寸

评论

0赞 Zar E Ahmer 4/24/2014
使用 dp 而不是 px。因为它会扭曲您与其他设备的布局。
0赞 jmaculate 6/16/2014
不要忘记乘以 getResources().getDisplayMetrics().density 来考虑显示缩放
0赞 Armfoot 9/2/2014
这证明得票最多的答案并不总是最好的(很多人重复答案)。除了 getSize 和已弃用的 getWidth/getHeight 组合(忽略错误)之外,请尝试 Balaji.K 的 .Nik 在他的回答中的评论甚至解释了要考虑系统/状态栏的大小。您也可以使用密度作为 jmaculate,LoungeKatt 解释为具有确切值: 在 Android v2.2 (API 8) 和 v4.0 中测试,结果良好,没有错误/警告getMetricsgetDisplayMetricsDisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;
0赞 Azahar 5/1/2015
DisplayMetrics displaymetrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(显示指标);int height = displaymetrics.heightPixels;int width = displaymetrics.widthPixels;
0赞 Täg 2/8/2019
获取 DisplayMetrics 的另一种方法:.你不需要得到它们。Resources.getSystem().getDisplayMetrics()Context

答:

33赞 Marcin Gil 6/19/2009 #1

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

评论

3赞 gcb 11/20/2010
这实际上是文档告诉你要做的......但如果你不使用视图,那就有点毫无意义了。您可能正在使用其他内容,例如 MGLConcesseView。
2赞 Dori 3/1/2011
这样会更好,因为父视图可能不是显示器的大小。但请确保这是在你查询的视图大小已经布局好的时候完成的,这通常不会在 onCreate() 中。您可以使用来自 onWindowFocusChanged(boolean hasFocus) 的自定义回调,该回调将在测量所有视图后调用,依此类推,确保您不会收到您感兴趣的视图的错误维度......
3568赞 Josef Pfleger 6/19/2009 #2

对于 API 级别 30,将使用 WindowMetrics.getBounds。可以在链接的文档中找到其用法示例:

 final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
 // Gets all excluding insets
 final WindowInsets windowInsets = metrics.getWindowInsets();
 Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()
         | WindowInsets.Type.displayCutout());

 int insetsWidth = insets.right + insets.left;
 int insetsHeight = insets.top + insets.bottom;

 // Legacy size that Display#getSize reports
 final Rect bounds = metrics.getBounds();
 final Size legacySize = new Size(bounds.width() - insetsWidth,
         bounds.height() - insetsHeight);

旧答案:

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

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

如果你不在 中,你可以通过以下方式获取默认值:ActivityDisplayWINDOW_SERVICE

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

如果位于片段中并且想要完成此操作,只需使用 Activity.WindowManager(在 Xamarin.Android 中)或 getActivity().getWindowManager() (在 java 中)。

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

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

评论

15赞 Carol 4/1/2012
getWidth() 还是 getSize()?如果我需要我的应用在 API <13 和 API >13 上运行,我会使用什么?
54赞 Arnaud 5/12/2012
try { display.getSize(size); width = size.x; height = size.y; } catch (NoSuchMethodError e) { width = display.getWidth(); height = display.getHeight(); }
256赞 Patrik 11/28/2012
我不明白你为什么要用于这样的检查?为什么不简单地使用而不引发任何异常呢?我认为在正常的应用程序流中是不好的做法。try/catchif (android.os.Build.VERSION.SDK_INT >= 13)try/catch
4赞 Patrik 12/30/2012
@A-Live,那么应用程序也会崩溃(但不会崩溃)。尽管如此,我们开发人员必须预先检查新的操作系统版本,这可能只是掩盖了一个问题。此外,有了这个论点,人们可以/应该用 try/catch 包围每几行代码,在我看来,这是已经提到的不好的做法。
14赞 android developer 5/13/2013
如果您想获取不包括导航栏和/或通知栏的屏幕尺寸怎么办
391赞 Balaji.K 1/31/2011 #3

一种方法是:

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

它已弃用,您应该尝试以下代码。前两行代码为您提供了目标。此对象包含类似 、 的字段。DisplayMetricsheightPixelswidthPixels

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

API 级别 30 更新

final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
 // Gets all excluding insets
 final WindowInsets windowInsets = metrics.getWindowInsets();
 Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()
         | WindowInsets.Type.displayCutout());

 int insetsWidth = insets.right + insets.left;
 int insetsHeight = insets.top + insets.bottom;

 // Legacy size that Display#getSize reports
 final Rect bounds = metrics.getBounds();
 final Size legacySize = new Size(bounds.width() - insetsWidth,
         bounds.height() - insetsHeight);

评论

19赞 Tony Chan 11/28/2011
请注意,指标(宽度、高度)会根据设备的旋转而变化。
9赞 Guy 12/29/2011
指标将返回显示的大小,但 HoneyComb 及以上,您的活动的空间将小于由于系统栏而返回的空间。
4赞 Hagai L 3/28/2012
@Guy这取决于您的实现。您可以隐藏状态栏:requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
83赞 Nik 7/11/2012
也以这种方式存在:getContext().getResources().getDisplayMetrics().widthPixels
2赞 Abandoned Cart 2/20/2014
最终浮点比例 = getResources().getDisplayMetrics().density;int width = (int) (metrics.widthPixels * scale + 0.5f);- 这样做时,您必须考虑设备密度。
123赞 Francesco Feltrinelli 4/7/2011 #4

它可能无法回答您的问题,但知道(当我遇到这个问题时我自己正在寻找它)可能会很有用,如果您需要视图的维度,但您的代码正在执行,而其布局尚未布局(例如,在 中),您可以设置一个 with 并将需要视图维度的相关代码放在那里。当布局完成布局时,将调用侦听器的回调。onCreate()ViewTreeObserver.OnGlobalLayoutListenerView.getViewTreeObserver().addOnGlobalLayoutListener()

评论

1赞 Lukas Hanacek 9/19/2013
或者只是写 view.post
1赞 marsbear 2/25/2014
不过,view.post 不能保证有效。这只是一种解决方法。
1赞 Tony Chan 3/22/2014
@marsbear它在哪里说不能保证工作?我很好奇,因为我也依靠这种方法在布局后获取视图的大小,并且不知道它不可靠。View.post()
1赞 marsbear 3/28/2014
@Turbo我说:p我们之前使用过这种解决方法,但结果证明它不可靠。该解决方法基于以下假设,即初始布局在与初始化相同的 UIThread 轮次内完成。因此,您可以通过 post() 安排您的代码在下一个 UI turn 之前运行,并且没问题。事实证明,在某些情况下,布局可能需要更长的时间,并且在运行发布的代码时视图仍未布局。我现在要做的是在 onCreate 中添加 ViewTreeObserver 并在第一个 onLayout 之后将其删除。在第一次 onLayout 期间初始化你的东西。
1赞 Tony Chan 4/10/2014
@marsbear你从哪里得到的有关系吗?还是它们都共享同一个?ViewViewTreeObserver
19赞 Crbreingan 12/22/2011 #5

为了使用 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>
13赞 Justin 1/7/2012 #6

我发现这成功了。

Rect dim = new Rect();
getWindowVisibleDisplayFrame(dim);

评论

5赞 Norbert 7/19/2012
很酷,但是源代码中关于这种方法的一件可怕的事情是:这条评论
17赞 pellucide 3/16/2012 #7

只是补充弗朗切斯科的答案。如果您想找出窗口中的位置或屏幕中的位置,另一个更合适的观察者是 ViewTreeObserver.OnPreDrawListener()

这也可用于查找视图的其他属性,这些属性在 onCreate() 时大多是未知的,例如滚动位置、缩放位置。

16赞 Vinothkumar Arputharaj 3/19/2012 #8

在 Activity 中使用以下代码。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;
17赞 NagarjunaReddy 6/18/2012 #9

查找屏幕的宽度和高度:

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();

使用它,我们可以获得最新及以上的 SDK 13。

// New width and height
int version = android.os.Build.VERSION.SDK_INT;
Log.i("", " name == "+ version);
Display display = getWindowManager().getDefaultDisplay();
int width;
if (version >= 13) {
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    Log.i("width", "if =>" +width);
}
else {
    width = display.getWidth();
    Log.i("width", "else =>" +width);
}
14赞 Shoaib Ahmed 6/27/2012 #10
public class AndroidScreenActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        String str_ScreenSize = "The Android Screen is: "
                                   + dm.widthPixels
                                   + " x "
                                   + dm.heightPixels;

        TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);
        mScreenSize.setText(str_ScreenSize);
    }
}
112赞 digiphd 7/24/2012 #11

(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,但这就是我们剩下的。

评论

1赞 digiphd 6/23/2015
是的,这是在 2012 年。
1赞 sudocoder 6/23/2015
对不起,请允许我澄清我的意思。截至 2015 年 6 月 22 日,任何人都不太可能支持 API <14
29赞 Jorgesys 10/17/2012 #12

我有两个函数,一个用于发送上下文,另一个用于获取以像素为单位的高度和宽度:

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

评论

0赞 Adil Malik 10/14/2013
您需要在函数签名上方添加才能进行编译。@SuppressLint("NewApi")
0赞 Sam 5/26/2015
我认为最好一次性获取高度和宽度,而不是单独调用 API,否则它们可能会不同步。如果在代码运行时屏幕方向发生变化,则可能会发生这种情况。
7赞 duggu 12/17/2012 #13

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

setContentView(R.layout.main);      
Display display = getWindowManager().getDefaultDisplay();
final int width = (display.getWidth());
final int height = (display.getHeight());

根据您的屏幕分辨率显示宽度和高度。

10赞 paulrehkugler 12/19/2012 #14

使用 DisplayMetrics (API 1) 有一种未弃用的方法可以做到这一点,它避免了 try/catch 混乱:

 // initialize the DisplayMetrics object
 DisplayMetrics deviceDisplayMetrics = new DisplayMetrics();

 // populate the DisplayMetrics object with the display characteristics
 getWindowManager().getDefaultDisplay().getMetrics(deviceDisplayMetrics);

 // get the width and height
 screenWidth = deviceDisplayMetrics.widthPixels;
 screenHeight = deviceDisplayMetrics.heightPixels;
19赞 Pijusn 12/27/2012 #15

这是我用于任务的代码:

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

看起来足够干净,但处理了弃用。

14赞 Sergei Pikalev 3/16/2013 #16

需要说的是,如果你不在 中,而是在 中(或者在你的作用域中有类型的变量),则不需要使用 .然后,您至少可以使用两种方式。ActivityViewViewWINDOW_SERVICE

第一:

DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();

第二:

DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);

我们在这里调用的所有这些方法都没有被弃用。

75赞 Dragan Marjanović 3/29/2013 #17

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

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

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

评论

12赞 Andy Cochrane 6/1/2013
这是这里唯一考虑窗口装饰(状态栏/菜单栏)的帖子。对我来说效果很好。
6赞 Erik B 6/22/2013
太棒了,但是你永远不应该预料到业务逻辑触发异常。异常触发(即使被捕获)对性能来说是可怕的。此外,如果SDK_INT为 13 >,您所做的工作比需要的要多。相反,您应该在Build.VERSION.SDK_INT上添加一些 if。
4赞 Dragan Marjanović 6/23/2013
@Erik B,我同意。我添加了改进版本。尽管如此,我还是保留了“自 SDK 1 以来”的部分,以防万一在 try/catch 中出现问题(我在 Android 中看到了很多不好的事情,尤其是当您认为不可能出错时,所以我喜欢:)保持安全)。无论如何,不应该有太多的开销,因为这种计算应该只进行一次(例如,值可以保留在某些静态属性中)。
9赞 TalkLittle 8/12/2013
请注意,此代码是根据 GPL v3 许可的,这对于在生产应用程序中使用有影响。
1赞 Michel 11/14/2015
GPL 并依靠反射来调用将来的 Android 版本中可能不存在的方法。嗯
10赞 Simon 4/21/2013 #18

我会像这样包装getSize代码:

@SuppressLint("NewApi")
public static Point getScreenSize(Activity a) {
    Point size = new Point();
    Display d = a.getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        d.getSize(size);
    } else {
        size.x = d.getWidth();
        size.y = d.getHeight();
    }
    return size;
}

评论

0赞 jww 9/6/2014
这会在运行 Android 4.0 (API 14) 的模拟器上崩溃。
19赞 David Corsalini 5/13/2013 #19

这不是一个更好的解决方案吗?DisplayMetrics 附带了您需要的一切,并从 API 1 开始工作。

public void getScreenInfo(){
    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

    heightPixels = metrics.heightPixels;
    widthPixels = metrics.widthPixels;
    density = metrics.density;
    densityDpi = metrics.densityDpi;
}

您还可以使用 getRealMetrics 获取实际显示(包括屏幕装饰,例如状态栏或软件导航栏),但这仅适用于 17+。

我错过了什么吗?

评论

1赞 Steven L 10/10/2013
它不会为屏幕控件(例如在平板电脑或 Nexus 设备上)减去空间。此外,我在 10 英寸平板电脑上得到了不同的值(750 与 800),具体取决于计算完成时活动是否处于活动状态。但就我而言,这很好。谢谢!
6赞 Steve Waring 5/22/2013 #20

有时,在 Activity 的 onCreate 中,您需要知道布局可用空间的精确尺寸。 经过一番思考,我找到了这种方式。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivityForResult(new Intent(this, Measure.class), 1);
        // Return without setting the layout, that will be done in onActivityResult.
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -1);
        // Width is now set to the precise available width, and a layout can now be created.            ...
    }
}

public final class Measure extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
       // Create a LinearLayout with a MeasureFrameLayout in it.
        // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
        LinearLayout linearLayout = new LinearLayout(this);
        LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
        measureFrameLayout.setLayoutParams(matchParent);
        linearLayout.addView(measureFrameLayout);
        this.addContentView(linearLayout, matchParent);
        // measureFrameLayout will now request this second activity to finish, sending back the width.
    }

    class MeasureFrameLayout extends FrameLayout {
        boolean finished = false;
        public MeasureFrameLayout(Context context) {
            super(context);
        }

        @SuppressLint("DrawAllocation")
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            if (finished) {
                return;
            }
            finished = true;
            // Send the width back as the result.
            Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
            Measure.this.setResult(Activity.RESULT_OK, data);
            // Tell this activity to finish, so the result is passed back.
            Measure.this.finish();
        }
    }
}

如果出于某种原因,您不想向 Android 清单添加其他 Activity,可以按以下方式执行此操作:

public class MainActivity extends Activity {
    static Activity measuringActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            extras = new Bundle();
        }
        int width = extras.getInt("Width", -2);
        if (width == -2) {
            // First time in, just start another copy of this activity.
            extras.putInt("Width", -1);
            startActivityForResult(new Intent(this, MainActivity.class).putExtras(extras), 1);
            // Return without setting the layout, that will be done in onActivityResult.
            return;
        }
        if (width == -1) {
            // Second time in, here is where the measurement takes place.
            // Create a LinearLayout with a MeasureFrameLayout in it.
            // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
            LinearLayout linearLayout = new LinearLayout(measuringActivity = this);
            LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
            measureFrameLayout.setLayoutParams(matchParent);
            linearLayout.addView(measureFrameLayout);
            this.addContentView(linearLayout, matchParent);
            // measureFrameLayout will now request this second activity to finish, sending back the width.
        }
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -3);
        // Width is now set to the precise available width, and a layout can now be created. 
        ...
    }

class MeasureFrameLayout extends FrameLayout {
    boolean finished = false;
    public MeasureFrameLayout(Context context) {
        super(context);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (finished) {
            return;
        }
        finished = true;
        // Send the width back as the result.
        Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
        MainActivity.measuringActivity.setResult(Activity.RESULT_OK, data);
        // Tell the (second) activity to finish.
        MainActivity.measuringActivity.finish();
    }
}    

评论

0赞 Steve Waring 5/22/2013
显然,您也可以将捆绑包中的高度传回。
5赞 christinac 6/27/2013 #21

如果不希望 WindowManagers、Points 或 Displays 的开销,则可以获取 XML 中最顶层的 View 项的高度和宽度属性,前提是其高度和宽度设置为 match_parent。(只要您的布局占据整个屏幕,就是如此。

例如,如果 XML 以如下内容开头:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/entireLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

然后将返回屏幕的宽度,并返回屏幕的高度。findViewById(R.id.entireLayout).getWidth()findViewById(R.id.entireLayout).getHeight()

14赞 RenniePet 8/17/2013 #22

这不是 OP 的答案,因为他想要以真实像素为单位显示尺寸。我想要“与设备无关的像素”中的尺寸,并将 https://stackoverflow.com/a/17880012/253938 和这里的答案放在一起 https://stackoverflow.com/a/6656774/253938 我想出了这个:

    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
    int dpHeight = (int)(displayMetrics.heightPixels / displayMetrics.density + 0.5);
    int dpWidth = (int)(displayMetrics.widthPixels / displayMetrics.density + 0.5);
48赞 Swapnil Sonar 8/27/2013 #23

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

示例代码

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

该变量给出像素中的高度。result

用于快速访问

Enter image description here

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

评论

0赞 Michel 11/14/2015
正是我需要的! 给出实际的全屏高度。Dragan Marjanović 的答案也有效,但我更喜欢这种更短、更简单的解决方案。getResources().getDisplayMetrics().heightPixels + result
0赞 Jan Heinrich Reimer 2/21/2016
这种方法在 Android Marshmallow 中已经过时。状态栏高度可能因设备或 Android 版本而异。最好使用 OnApplyWindowInsetsListener
9赞 Francesco Vadicamo 9/9/2013 #24

对于正在寻找没有状态栏和操作栏可用屏幕尺寸的人(也感谢 Swapnil 的回答):

DisplayMetrics dm = getResources().getDisplayMetrics();
float screen_w = dm.widthPixels;
float screen_h = dm.heightPixels;

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

TypedValue typedValue = new TypedValue();
if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)){
    screen_h -= getResources().getDimensionPixelSize(typedValue.resourceId);
}
3赞 Rutger 11/3/2013 #25

我有一个初始屏幕活动,其中 LinearLayout 作为根视图,其宽度和高度match_parent。这是该活动方法中的代码。我在应用程序的所有其他活动中使用这些措施。onCreate()

int displayWidth = getRawDisplayWidthPreHoneycomb();
int rawDisplayHeight = getRawDisplayHeightPreHoneycomb();
int usableDisplayHeight = rawDisplayHeight - getStatusBarHeight();
pf.setScreenParameters(displayWidth, usableDisplayHeight);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    LinearLayout myView = (LinearLayout) findViewById(R.id.splash_view);
    myView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
            if (left == 0 && top == 0 && right == 0 && bottom == 0) {
                return;
            }
            int displayWidth = Math.min(right, bottom);
            int usableDisplayHeight = Math.max(right, bottom);
            pf.setScreenParameters(displayWidth, usableDisplayHeight);
        }
    });
}

以下是您在上面看到的方法的实现:

private int getRawDisplayWidthPreHoneycomb() {
    WindowManager windowManager = getWindowManager();
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getMetrics(displayMetrics);

    int widthPixels = displayMetrics.widthPixels;
    int heightPixels = displayMetrics.heightPixels;

    return Math.min(widthPixels, heightPixels);
}

private int getRawDisplayHeightPreHoneycomb() {
    WindowManager w = getWindowManager();
    Display d = w.getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    d.getMetrics(metrics);

    int widthPixels = metrics.widthPixels;
    int heightPixels = metrics.heightPixels;

    return Math.max(widthPixels, heightPixels);
}

public int getStatusBarHeight() {
    int statusBarHeight = 0;

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

    return statusBarHeight;
}

这会导致所有 API 版本和不同类型的设备(手机和平板电脑)的可用显示器的高度和宽度,不包括任何类型的栏(状态栏、导航栏)。

7赞 sonida 11/8/2013 #26

请按照以下方法操作:

public static int getWidthScreen(Context context) {
    return getDisplayMetrics(context).widthPixels;
}

public static int getHeightScreen(Context context) {
    return getDisplayMetrics(context).heightPixels;
}

private static DisplayMetrics getDisplayMetrics(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics;
}
17赞 Cristiana Chavez 12/18/2013 #27
DisplayMetrics dimension = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dimension);
int w = dimension.widthPixels;
int h = dimension.heightPixels;
1赞 Jakob Harteg 6/12/2014 #28

功能简单,也与较低版本兼容。

/**
 * @return screen size int[width, height]
 *
 * */
public int[] getScreenSize(){
    Point size = new Point();
    WindowManager w = getWindowManager();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){
        w.getDefaultDisplay().getSize(size);
        return new int[]{size.x, size.y};
    }else{
        Display d = w.getDefaultDisplay();
        //noinspection deprecation
        return new int[]{d.getWidth(), d.getHeight()};
    }
}

要使用:

int width = getScreenSize()[0];
int height = getScreenSize()[1];
0赞 Armfoot 9/2/2014 #29
DisplayMetrics dm = getResources().getDisplayMetrics();
float fwidth = dm.density * dm.widthPixels;
float fheight = dm.density * dm.heightPixels;

如果由于minSDKVersion而导致错误,并且您不想使用已弃用的方法(&),则该解决方案最初由Balaji.K发布于2011年...Nik 还添加了一条评论,解释说还考虑了状态栏的大小。getSizegetWidthgetHeightgetMetricsgetDisplayMetrics

其他一些注释是指乘以比例(密度)以获得尺寸的精确浮点值。在 Android v2.2 (API 8) 和 v4.0 中进行了测试,结果良好,没有错误/警告

54赞 Zelleriation 11/26/2014 #30

最简单的方法:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 
1赞 Abhishek 1/5/2016 #31

此函数返回近似的屏幕尺寸(以英寸为单位)。

public double getScreenSize()
{
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int width=dm.widthPixels;
        int height=dm.heightPixels;
        int dens=dm.densityDpi;
        double wi=(double)width/(double)dens;
        double hi=(double)height/(double)dens;
        double x = Math.pow(wi,2);
        double y = Math.pow(hi,2);
        double screenInches = Math.sqrt(x+y);
        return screenInches;
}
2赞 Maharshi Saparia 7/29/2017 #32

如果 Display 类不起作用,上面的答案将不起作用,那么您可以通过以下方法获取宽度和高度。

private static final int WIDTH_INDEX = 0;
private static final int HEIGHT_INDEX = 1;

    public static int[] getScreenSize(Context context) {
        int[] widthHeight = new int[2];
        widthHeight[WIDTH_INDEX] = 0;
        widthHeight[HEIGHT_INDEX] = 0;

        try {
            WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Display display = windowManager.getDefaultDisplay();

            Point size = new Point();
            display.getSize(size);
            widthHeight[WIDTH_INDEX] = size.x;
            widthHeight[HEIGHT_INDEX] = size.y;

            if (!isScreenSizeRetrieved(widthHeight))
            {
                DisplayMetrics metrics = new DisplayMetrics();
                display.getMetrics(metrics);
                widthHeight[0] = metrics.widthPixels;
                widthHeight[1] = metrics.heightPixels;
            }

            // Last defense. Use deprecated API that was introduced in lower than API 13
            if (!isScreenSizeRetrieved(widthHeight)) {
                widthHeight[0] = display.getWidth(); // deprecated
                widthHeight[1] = display.getHeight(); // deprecated
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return widthHeight;
    }

    private static boolean isScreenSizeRetrieved(int[] widthHeight) {
        return widthHeight[WIDTH_INDEX] != 0 && widthHeight[HEIGHT_INDEX] != 0;
    }
14赞 Sharath kumar 9/4/2017 #33

要获取屏幕尺寸,请使用显示指标

DisplayMetrics displayMetrics = new DisplayMetrics();
if (context != null) 
      WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
      Display defaultDisplay = windowManager.getDefaultDisplay();
      defaultDisplay.getRealMetrics(displayMetrics);
    }

获取高度和宽度(以像素为单位)

int width  =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;
11赞 Jéwôm' 10/9/2017 #34

您可以使用以下命令获取高度大小:

getResources().getDisplayMetrics().heightPixels;

宽度大小使用

getResources().getDisplayMetrics().widthPixels; 
1赞 Joao Gavazzi 10/15/2017 #35

以下是对 Kotlin 实现中上述一些答案的简单改编。如上所述,它需要清单中的 windowsSoftInput=“adjustResize”:

class KeyboardWatcher(private val layoutRooView: View) {

    companion object {
        private const val MIN_KEYBOARD_HEIGHT = 200f
    }

    private val displayMetrics: DisplayMetrics = layoutRooView.resources.displayMetrics
    private var stateVisible = false

    var observer: ((Boolean) -> Unit)? = null

    init {
        layoutRooView.viewTreeObserver.addOnGlobalLayoutListener {
            val heightDiff = layoutRooView.rootView.height - layoutRooView.height
            if (!stateVisible && heightDiff > dpToPx(MIN_KEYBOARD_HEIGHT)) {
                stateVisible = true
                observer?.invoke(stateVisible)
            } else if(stateVisible) {
                stateVisible = false
                observer?.invoke(stateVisible)
            }
        }
    }

    private fun dpToPx(valueInDp: Float): Float {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, displayMetrics)
    }
}

并使用:

val activityRootView = findViewById<ViewGroup>(R.id.activityRoot)
KeyboardWatcher(activityRootView).observer = { visible ->
    if (visible) do something here ...
}
0赞 Mike T 7/19/2018 #36

我使用了上述建议,并为我们的问题创建了一个 kotlin 版本。希望这能为那些使用 kotlin 的人提供一些额外的帮助:

private val screenDimensions: Int by lazy {
    val display = (context.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay
    Point()
        .also { size ->
            when {
                Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 -> display.getRealSize(size)
                else -> display.getSize(size)
            }
        }
}

screenDimensions.x // width
screenDimensions.y // height
8赞 Khemraj Sharma 10/1/2018 #37

Kotlin

fun getScreenHeight(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.heightPixels
}

fun getScreenWidth(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.widthPixels
}

评论

1赞 IgorGanapolsky 10/4/2022
为什么不使用全球资源:Resources.getSystem().displayMetrics.heightPixels
0赞 Artem Botnev 2/27/2019 #38

我认为这是最简单的

private fun checkDisplayResolution() {
    val displayMetrics = DisplayMetrics().also {
        windowManager.defaultDisplay.getMetrics(it)
    }

    Log.i(TAG, "display width: ${displayMetrics.widthPixels}")
    Log.i(TAG, "display height: ${displayMetrics.heightPixels}")
    Log.i(TAG, "display width dpi: ${displayMetrics.xdpi}")
    Log.i(TAG, "display height dpi: ${displayMetrics.ydpi}")
    Log.i(TAG, "display density: ${displayMetrics.density}")
    Log.i(TAG, "display scaled density: ${displayMetrics.scaledDensity}")
}

评论

0赞 Federico Navarrete 10/25/2021
这似乎已被弃用。
1赞 Roman 2/22/2020 #39

创建 Kotlin 扩展函数来获取屏幕宽度和高度 -

fun Context?.screenWidthInPx(): Int {
    if (this == null) return 0
    val dm = DisplayMetrics()
    val wm = this.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    wm.defaultDisplay.getMetrics(dm)
    return dm.widthPixels
}
//comment
fun Context?.screenHeightInPx(): Int {
    if (this == null) return 0
    val dm = DisplayMetrics()
    val wm = this.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    wm.defaultDisplay.getMetrics(dm)
    return dm.heightPixels
}
3赞 Krishna Meena 7/10/2020 #40

上述代码已在 API 级别 30 中弃用。现在您可以使用以下代码获取

 val width = windowManager.currentWindowMetrics.bounds.width()
 val height = windowManager.currentWindowMetrics.bounds.height()

此方法报告窗口大小,包括所有系统栏区域,同时报告不包括导航栏和显示剪切区域的区域。可以使用以下方法获得报告的值:Display#getSize(Point)Display#getSize(Point)

 val metrics = windowManager.currentWindowMetrics
 // Gets all excluding insets
 val windowInsets = metrics.windowInsets
 var insets: Insets = windowInsets.getInsets(WindowInsets.Type.navigationBars())
 val cutout = windowInsets.displayCutout
 if (cutout != null) {
    val cutoutSafeInsets = Insets.of(cutout.safeInsetLeft, cutout.safeInsetTop, cutout.safeInsetRight, cutout.safeInsetBottom)
    insets = Insets.max(insets, cutoutSafeInsets)
 }

 val insetsWidth = insets.right + insets.left
 val insetsHeight = insets.top + insets.bottom

 // Legacy size that Display#getSize reports
 val legacySize =  Size(metrics.bounds.width() - insetsWidth, metrics.bounds.height() - insetsHeight)

源 : WindowManager#getCurrentWindowMetrics()

评论

0赞 Sourav Bagchi 8/26/2020
是否有任何向后兼容性的支持库?
0赞 Krishna Meena 8/26/2020
我认为不,对于低于 30 的 API 级别,您必须使用较早的方法,而对于 API 级别 30 及以上的新方法,您将不得不使用这种新方法
0赞 aminography 12/1/2020 #41

•通过Kotlin VersionExtension Property

在 android 中实现屏幕尺寸有多种方法,但我认为最好的解决方案可以独立于实例,因此您可以在代码中的任何地方使用它。在这里,我通过 kotlin 扩展属性提供了一个解决方案,它可以轻松知道以像素为单位的屏幕大小以及:Contextdp


维度Utils.kt

import android.content.res.Resources
import android.graphics.Rect
import android.graphics.RectF
import android.util.DisplayMetrics
import kotlin.math.roundToInt

/**
 * @author aminography
 */

private val displayMetrics: DisplayMetrics by lazy { Resources.getSystem().displayMetrics }

val screenRectPx: Rect
    get() = displayMetrics.run { Rect(0, 0, widthPixels, heightPixels) }

val screenRectDp: RectF
    get() = displayMetrics.run { RectF(0f, 0f, widthPixels.px2dp, heightPixels.px2dp) }

val Number.px2dp: Float
    get() = this.toFloat() / displayMetrics.density

val Number.dp2px: Int
    get() = (this.toFloat() * displayMetrics.density).roundToInt()


用法:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val widthPx = screenRectPx.width()
        val heightPx = screenRectPx.height()
        println("[PX] screen width: $widthPx , height: $heightPx")

        val widthDp = screenRectDp.width()
        val heightDp = screenRectDp.height()
        println("[DP] screen width: $widthDp , height: $heightDp")
    }
}

结果:

当设备处于纵向时:

[PX] screen width: 1440 , height: 2392
[DP] screen width: 360.0 , height: 598.0

当设备处于横向时:

[PX] screen width: 2392 , height: 1440
[DP] screen width: 598.0 , height: 360.0


如果您不是 kotlin 的粉丝,请使用 java 版本:

import android.content.res.Resources;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.DisplayMetrics;

/**
 * @author aminography
 */
public class DimensionUtils {

    private static DisplayMetrics displayMetrics;

    private static DisplayMetrics getDisplayMetrics() {
        if (displayMetrics == null) {
            displayMetrics = Resources.getSystem().getDisplayMetrics();
        }
        return displayMetrics;
    }

    public static Rect screenRectPx() {
        return new Rect(0, 0, getDisplayMetrics().widthPixels, getDisplayMetrics().heightPixels);
    }

    public static RectF screenRectDp() {
        return new RectF(0f, 0f, px2dp(getDisplayMetrics().widthPixels), px2dp(getDisplayMetrics().heightPixels));
    }

    public static float px2dp(int value) {
        return value / getDisplayMetrics().density;
    }

    public static int dp2px(float value) {
        return (int) (value * getDisplayMetrics().density);
    }
}
0赞 Rahul 5/11/2021 #42

科特林

fun getScreenHeight(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.heightPixels
}

fun getScreenWidth(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.widthPixels
}

爪哇岛

DisplayMetrics dimension = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dimension);
int w = dimension.widthPixels;
int h = dimension.heightPixels;
1赞 Zain 10/25/2021 #43

以下是以下/高于 API 30 代码的 Kotlin 扩展函数:

fun Activity.getScreenWidth(): Int {
    return if (Build.VERSION.SDK_INT < 30) {
        val displayMetrics = DisplayMetrics()
        windowManager.defaultDisplay.getMetrics(displayMetrics)
        displayMetrics.widthPixels
    } else {
        val metrics = windowManager.currentWindowMetrics
        val insets = metrics.windowInsets
            .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
        metrics.bounds.width() - insets.left - insets.right
    }
}

fun Activity.getScreenHeight(): Int {
    return if (Build.VERSION.SDK_INT < 30) {
        val displayMetrics = DisplayMetrics()
        windowManager.defaultDisplay.getMetrics(displayMetrics)
        displayMetrics.heightPixels
    } else {
        val metrics = windowManager.currentWindowMetrics
        val insets = metrics.windowInsets
            .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
        metrics.bounds.height() - insets.top - insets.bottom
    }
}

对应的 Java helper 方法:

public int getScreenWidth(Activity activity) {
    if (Build.VERSION.SDK_INT < 30) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics.widthPixels;
    } else {
        WindowMetrics metrics = activity.getWindowManager().getCurrentWindowMetrics();
        Insets insets = metrics.getWindowInsets()
                .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars());
        return metrics.getBounds().width() - insets.left - insets.right;
    }
}


public int getScreenHeight(Activity activity) {
    if (Build.VERSION.SDK_INT < 30) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics.heightPixels;
    } else {
        WindowMetrics metrics = activity.getWindowManager().getCurrentWindowMetrics();
        Insets insets = metrics.getWindowInsets()
                .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars());
        return metrics.getBounds().height() - insets.bottom - insets.top;
    }
}
0赞 amir hossein kazemi 1/4/2022 #44

创建一个类和一个方法,如下所示:

public MyPoint getScreenDimensionsAsPixel(Context context){
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();

        Point point = new Point();
        display.getSize(point);

        return new MyPoint(point.x, point.y);
    }

    public class MyPoint{
        private int width;
        private int height;

        public MyPoint(int width, int height) {
            this.width = width;
            this.height = height;
        }

        public int getWidth() {
            return width;
        }

        public void setWidth(int width) {
            this.width = width;
        }

        public int getHeight() {
            return height;
        }

        public void setHeight(int height) {
            this.height = height;
        }
    }

然后在代码中使用它们:

MyPoint myPoint = getScreenDimensionsAsPixel(MainActivity.this);
                Toast.makeText(MainActivity.this, "width: " + String.valueOf(myPoint.getWidth()) + "|" +
                        "height: " + String.valueOf(myPoint.getHeight()), Toast.LENGTH_LONG).show();
7赞 Syed Arsalan Kazmi 2/3/2022 #45

在 Kotlin 中要简单得多。

val displayMetrics = Resources.getSystem().displayMetrics
displayMetrics.heightPixels
displayMetrics.widthPixels

评论

0赞 Nayan 3/31/2023
这个很短很精确!!荣誉!!
0赞 Saik Caskey 5/26/2023
注意 - [正如其他人指出的]这个只使用静态系统值,如果你想确保这个值适合你的目的,请检查源/注释。Resources.getSystem