所以我有一个在 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 的尺寸(与屏幕大小相同)是否可行,但似乎应该有一种更简单的方法来做到这一点。
这有效:
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
}