代码之家  ›  专栏  ›  技术社区  ›  Chris B

如何获取屏幕尺寸

  •  1
  • Chris B  · 技术社区  · 2 年前

    所以我有一个在LinearLayout中定义ImageView的应用程序。ImageView和LinearLayout的宽度和高度被指定为“match_parent”,并且ImageView看起来与屏幕的尺寸相同。然而,当我试图获取屏幕的尺寸以创建位图并将其附加到ImageView时,高度与屏幕的高度匹配,但宽度返回时略小于屏幕的宽度。我正在使用以下代码来获取宽度和高度。

        val width = resources.displayMetrics.widthPixels
        val height = resources.displayMetrics.heightPixels
    

    还有一点:

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

    但这需要API级别30(我希望我的应用程序能够从API级别24运行),即使我将API的最低级别提高到30,也会给出不正确的宽度值。

    如果我使用这个,也会发生同样的事情:

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

    这是不赞成的:

    windowManager.defaultDisplay
    

    所以我真的不确定如何获得正确的屏幕宽度。对于记录,创建位图的代码如下所示:

            val bitmap = Bitmap.createBitmap(width.toInt(), height.toInt(), Bitmap.Config.ARGB_8888)
    

    我现在想知道(在发布问题后)使用ViewTreeObserver来获取ImageView的尺寸(与屏幕大小相同)是否可行,但似乎应该有一种更简单的方法来做到这一点。

    0 回复  |  直到 2 年前
        1
  •  0
  •   Chris B    2 年前

    这项工作:

            val mainLayout: LinearLayout = findViewById(R.id.main_layout)
            mainLayout.viewTreeObserver.addOnGlobalLayoutListener(
            object : ViewTreeObserver.OnGlobalLayoutListener {
                override fun onGlobalLayout() {
                    val imageView = findViewById<ImageView>(R.id.image_view)
                    val width = imageView.width
                    val height = imageView.height
                    // do initialization
                }
            }
        )
    }
    

    这与使用lambda表达式是一样的:

            val mainLayout: LinearLayout = findViewById(R.id.main_layout)
            mainLayout.viewTreeObserver.addOnGlobalLayoutListener {
            val imageView = findViewById<ImageView>(R.id.image_view)
            val width = imageView.width
            val height = imageView.height
            // do initialization
        }