在Android中获取屏幕宽度和高度

634

我该如何获取屏幕宽度和高度,并在代码中使用这个值:

@Override protected void onMeasure(int widthSpecId, int heightSpecId) {
    Log.e(TAG, "onMeasure" + widthSpecId);
    setMeasuredDimension(SCREEN_WIDTH, SCREEN_HEIGHT - 
        game.findViewById(R.id.flag).getHeight());
}

2
请参见以下链接:https://dev59.com/hnNA5IYBdhLWcg3wUL5Y - Will Tate
2
这个回答解决了你的问题吗?如何在Android中获取屏幕尺寸作为像素 - AdamHurwitz
更新正确答案:https://dev59.com/Vm445IYBdhLWcg3wq8Pp#67691009 - Rasoul Miri
36个回答

10
DisplayMetrics lDisplayMetrics = getResources().getDisplayMetrics();
int widthPixels = lDisplayMetrics.widthPixels;
int heightPixels = lDisplayMetrics.heightPixels;

9

由于getMetrics和getRealMetrics已经过时,Google建议通过以下方式确定屏幕宽度和高度:

WindowMetrics windowMetrics = getActivity().getWindowManager().getMaximumWindowMetrics();
Rect bounds = windowMetrics.getBounds();
int widthPixels = bounds.width();
int heightPixels = bounds.height();

然而,我找到了另一种方法可以让我得到相同的结果:

Configuration configuration = mContext.getResources().getConfiguration();
Display.Mode mode = display.getMode();
int widthPixels = mode.getPhysicalWidth();
int heightPixels = mode.getPhysicalHeight();

这是在Android R中唯一有效的答案。 - SemicolonSpace
1
你从哪里找到了 display.getMode() - Matthew Nantes
你可以从这里获取:https://developer.android.com/reference/android/view/Display#getMode() - Patrick

9

这里的所有答案都不能正确地适用于Chrome OS多个显示器,或即将推出的可折叠设备。

在查找当前配置时,请始终使用getResources().getConfiguration()中当前活动的配置。 不要使用后台活动或系统资源中的配置。 后台活动没有大小,而系统的配置可能包含具有冲突大小和方向的多个窗口,因此无法提取可用数据。

所以答案是

val config = context.getResources().getConfiguration()
val (screenWidthPx, screenHeightPx) = config.screenWidthDp.dp to config.screenHeightDp.dp

8

针对Kotlin用户

fun Activity.displayMetrics(): DisplayMetrics {
   val displayMetrics = DisplayMetrics()
   windowManager.defaultDisplay.getMetrics(displayMetrics)
   return displayMetrics
}

在 Activity 中,您可以像这样使用它:

     resources.displayMetrics.let { displayMetrics ->
        val height = displayMetrics.heightPixels
        val width = displayMetrics.widthPixels
    }

或者在片段中
    activity?.displayMetrics()?.run {
        val height = heightPixels
        val width = widthPixels
    }

7

实现获取真实分辨率(包括用户更改分辨率后)的完整方法是使用“getRealSize”。

我注意到所有其他可用函数,包括文档中建议使用的函数,都存在某些情况下结果更小的情况。

以下是代码:

            WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            Point size = new Point();
            wm.getDefaultDisplay().getRealSize(size);
            final int width = size.x, height = size.y;

既然在不同方向上可能会发生变化,这里有一个解决方案(使用Kotlin),无论方向如何都可以正确获取:

/**
 * returns the natural orientation of the device: Configuration.ORIENTATION_LANDSCAPE or Configuration.ORIENTATION_PORTRAIT .<br></br>
 * The result should be consistent no matter the orientation of the device
 */
@JvmStatic
fun getScreenNaturalOrientation(context: Context): Int {
    //based on : https://dev59.com/gm455IYBdhLWcg3wFP9u#9888357
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val config = context.resources.configuration
    val rotation = windowManager.defaultDisplay.rotation
    return if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && config.orientation == Configuration.ORIENTATION_LANDSCAPE || (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && config.orientation == Configuration.ORIENTATION_PORTRAIT)
        Configuration.ORIENTATION_LANDSCAPE
    else
        Configuration.ORIENTATION_PORTRAIT
}

/**
 * returns the natural screen size (in pixels). The result should be consistent no matter the orientation of the device
 */
@JvmStatic
fun getScreenNaturalSize(context: Context): Point {
    val screenNaturalOrientation = getScreenNaturalOrientation(context)
    val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val point = Point()
    wm.defaultDisplay.getRealSize(point)
    val currentOrientation = context.resources.configuration.orientation
    if (currentOrientation == screenNaturalOrientation)
        return point
    else return Point(point.y, point.x)
}

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

6

根据官方Android文档,针对默认显示,请使用Context#getDisplay()方法,因为此方法在API级别30中已被弃用。

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

下面给出的Kotlin代码是根据最新版本的Android编写的,可帮助您确定宽度和高度:

fun getWidth(context: Context): Int {
    var width:Int = 0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        val displayMetrics = DisplayMetrics()
        val display: Display? = context.getDisplay()
        display!!.getRealMetrics(displayMetrics)
        return displayMetrics.widthPixels
    }else{
        val displayMetrics = DisplayMetrics()
        this.windowManager.defaultDisplay.getMetrics(displayMetrics)
        width = displayMetrics.widthPixels
        return width
    }
}

fun getHeight(context: Context): Int {
    var height: Int = 0
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        val displayMetrics = DisplayMetrics()
        val display = context.display
        display!!.getRealMetrics(displayMetrics)
        return displayMetrics.heightPixels
    }else {
        val displayMetrics = DisplayMetrics()
        this.windowManager.defaultDisplay.getMetrics(displayMetrics)
        height = displayMetrics.heightPixels
        return height
    }
}

1
你能否给出一个完整的例子? - dilshan
1
你可以复制代码并调用函数,例如 var one = getHeight(this),当调用函数时,显示器的高度值将被存储在变量one中,因为函数返回高度和宽度值。 - Mohit Yadav

6
fun Activity.getRealScreenSize(): Pair<Int, Int> { //<width, height>
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    val size = Point()
    display?.getRealSize(size)
    Pair(size.x, size.y)
} else {
    val size = Point()
    windowManager.defaultDisplay.getRealSize(size)
    Pair(size.x, size.y)

}}

这是一个扩展函数,你可以像这样在你的活动中使用它:
 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val pair = getRealScreenSize()
    pair.first //to get width
    pair.second //to get height
}

仅提供代码的答案是低质量的答案。 - Taslim Oseni
@TaslimOseni 我更新了我的解答,并提供了使用示例。 - DevWM

5

获取屏幕宽度和高度的值。

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

5

在尝试了很多版本之后,我在 Kotlin 中找到了一个答案。它准确地返回设备广告的分辨率。如果这在旧设备上不起作用,请让我知道--目前我只有相对较新的设备。

该解决方案不使用任何已弃用的函数(截至 2023 年 1 月)。

private fun getScreenHeight() : Int {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        val windowMetrics = windowManager.currentWindowMetrics
        val rect = windowMetrics.bounds
        rect.bottom
    } else {
        resources.displayMetrics.heightPixels
    }
}

这给了我2030,但实际上是2160。安卓9 - kallis
@kallis 真的吗?你用的是哪个设备?我想追查一下并弄清楚细节。很遗憾,在安卓上,这么基本的事情一直都很麻烦。 - SMBiggs
这个设备是红米Note 5 Pro。 - kallis
1
我最终使用了val outPoint = Point() view.display.getRealSize(outPoint)。这在所有设备上都能正常工作。我从谷歌的GitHub项目中找到了这个方法,该项目最后更新于4月17日,但文档表示该方法已被弃用。也许他们自己都不确定。 - kallis
很高兴getRealSize()在您的设备上仍然可用。希望这对其他人有所帮助。 - SMBiggs
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接