代码之家  ›  专栏  ›  技术社区  ›  Niko Gamulin

获取屏幕尺寸(像素)

  •  1742
  • Niko Gamulin  · 技术社区  · 15 年前

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

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

    我如何得到 screenWidth screenHeight 在主要活动中?

    37 回复  |  直到 6 年前
        1
  •  3397
  •   SATYAJEET RANJAN    6 年前

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

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

    如果你不在 Activity 你可以得到默认值 Display 通过 WINDOW_SERVICE :

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

    如果你在一个片段中,想要实现这一点,只需使用Accviv.WistoMeCube(在XAMARIN。Android)或GETActuvio().GETWOMWOMMARTER()(在Java中)。

    以前 获取大小 在API级别13中,您可以使用 getWidth 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 获取以下信息:

    “显示的绝对宽度(像素)。”

    例子:

    Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);
    
        2
  •  358
  •   Community Romance    8 年前

    一种方法是:

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

    它已被弃用,您应该改为尝试以下代码。前两行代码提供了DisplayMetrics对象。此对象包含像heightpixels、widthpixels这样的字段。

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    
    int height = metrics.heightPixels;
    int width = metrics.widthPixels;
    
        3
  •  114
  •   Francesco Feltrinelli    13 年前

    它可能无法回答您的问题,但如果您需要视图的维度,但您的代码在尚未布局布局时(例如在 onCreate() )您可以设置 ViewTreeObserver.OnGlobalLayoutListener 具有 View.getViewTreeObserver().addOnGlobalLayoutListener() 并将需要视图维度的相关代码放在那里。布局完成后,将调用侦听器的回调。

        4
  •  104
  •   digiphd    9 年前

    (2012年答案,可能已过时)如果您想要支持预蜂窝,则需要在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的用户,这就是我们剩下的。

        5
  •  64
  •   dakshbhatt21 czaku    11 年前

    我尝试过所有可能的“解决方案”都没有成功,我注意到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) {
    }
    

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

    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) {
    }
    
        6
  •  46
  •   Zelleriation    10 年前

    最简单的方法:

     int screenHeight = getResources().getDisplayMetrics().heightPixels;
     int screenWidth = getResources().getDisplayMetrics().widthPixels; 
    
        7
  •  46
  •   Anik Islam Abhi    9 年前

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

    样例代码

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

    变量 result 以像素为单位给出高度。

    快速访问

    Enter image description here

    有关高度的详细信息 Title bar , Navigation bar Content View ,请看 Android Device Screen Sizes .

        8
  •  30
  •   Anik Islam Abhi    9 年前

    先查看(例如 findViewById() )然后你可以用 getWidth() 在视图本身上。

        9
  •  26
  •   Peter Mortensen Mohit    10 年前

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

    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;
    }
    
        10
  •  17
  •   Community Romance    7 年前

    对于使用XML进行动态缩放,有一个名为“android:layout-weight”的属性

    下面的示例,根据synic对 this thread ,显示一个占屏幕75%的按钮(权重=0.25)和一个占屏幕剩余25%的文本视图(权重=0.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>
    
        11
  •  17
  •   Pijusn    12 年前

    这是我用于任务的代码:

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

    看起来足够干净,但是,要注意贬值。

        12
  •  17
  •   David Corsalini    11 年前

    这不是更好的解决方案吗? 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+上有效。

    我错过什么了吗?

        13
  •  15
  •   pellucide    12 年前

    只是增加了弗朗西斯科的回答。如果你想找出窗口中的位置或屏幕中的位置,另一个更合适的观察者是 ViewTreeObserver.OnPreDrawListener()

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

        14
  •  15
  •   Peter Mortensen Mohit    10 年前

    查找屏幕的宽度和高度:

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

    通过这个,我们可以得到最新的和更高版本的SDK13。

    // 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);
    }
    
        15
  •  14
  •   Vinothkumar Arputharaj    12 年前

    在活动中使用以下代码。

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int height = metrics.heightPixels;
    int wwidth = metrics.widthPixels;
    
        16
  •  14
  •   Peter Mortensen Mohit    10 年前
    DisplayMetrics dimension = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dimension);
    int w = dimension.widthPixels;
    int h = dimension.heightPixels;
    
        17
  •  11
  •   Justin    13 年前

    我发现这确实起了作用。

    Rect dim = new Rect();
    getWindowVisibleDisplayFrame(dim);
    
        18
  •  11
  •   Sergei Pikalev    11 年前

    需要说的是,如果你不在 Activity 但在 View (或有变量 视图 在您的范围内键入),不需要使用 WINDOW_SERVICE . 然后至少可以使用两种方法。

    第一:

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

    第二:

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

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

        19
  •  11
  •   Peter Mortensen Mohit    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);
        }
    }
    
        20
  •  9
  •   Mohamed Nageh    7 年前

    要获得屏幕尺寸,请使用显示度量

    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;
    
        21
  •  8
  •   Community Romance    7 年前

    这不是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);
    
        22
  •  7
  •   paulrehkugler    12 年前

    有一种使用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;
    
        23
  •  7
  •   Simon    11 年前

    我将像这样包装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;
    }
    
        24
  •  7
  •   Jéwôm'    7 年前

    你可以得到 高度 使用尺寸:

    getResources().getDisplayMetrics().heightPixels;
    

    以及 宽度 使用尺寸

    getResources().getDisplayMetrics().widthPixels; 
    
        25
  •  5
  •   Francesco Vadicamo    11 年前

    寻找谁 可用屏幕尺寸 没有 状态栏 作用杆 (还要感谢斯瓦普尼尔的回答):

    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);
    }
    
        26
  •  5
  •   Peter Mortensen Mohit    10 年前

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

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

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

        27
  •  5
  •   Peter Mortensen Mohit    8 年前

    遵循以下方法:

    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;
    }
    
        28
  •  4
  •   Steve Waring    11 年前

    在活动的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清单中添加其他活动,可以这样做:

    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();
        }
    }    
    
        29
  •  4
  •   christinac    11 年前

    如果不希望窗口管理器、点或显示的开销,则可以获取XML中最顶层视图项的高度和宽度属性,前提是将其高度和宽度设置为与父级匹配。(只要布局占据整个屏幕,这是正确的。)

    例如,如果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() 将返回屏幕高度。

        30
  •  3
  •   Daniel    7 年前

    我有一个以线性布局作为根视图的启动屏幕活动, 配对母体 宽度和高度。这是中的代码 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版本和不同类型的设备(电话和平板电脑)的可用显示器的高度和宽度,不包括任何类型的栏(状态栏、导航栏)。