📐

Androidで画面サイズ(dp)を取得する

2023/06/11に公開

はじめに

Jetpack Composeでは、LocalConfiguration.current.screenWidthDp/screenHeightDpから、画面サイズ(dp)をシンプルに取得できます。一方、Composable関数内ではなく、onCreate内では異なる方法で取得する必要があります。その方法が(自分の検索能力が低いからか)すっと出てこなかったので、備忘録として記事にすることにしました。

Composable関数内の場合

val configuration = LocalConfiguration.current
val screenWidth = configuration.screenWidthDp
val screenHeight = configuration.screenHeightDp

onCreateなどの関数内の場合

APIレベル30(Android 11)以降

val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager // 通常のActivityではなくServiceの場合のみ必要
val bounds = windowManager.currentWindowMetrics.bounds
val insets = windowManager.currentWindowMetrics.windowInsets
    .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
val dp = resources.displayMetrics.density
val screenWidth = bounds.width()/dp
val screenHeight = (bounds.height() - insets.top - insets.bottom)/dp

APIレベル30未満

val windowManager = getSystemService(WINDOW_SERVICE) as WindowManager // 通常のActivityではなくServiceの場合のみ必要
val display = windowManager.defaultDisplay
val size = Point()
display.getSize(size)
val dp = resources.displayMetrics.density
val screenWidth = (size.x/dp).toInt()
val screenHeight = (size.y/dp).toInt()

おわりに

APIレベルで場合分けがあるのほんとツライ、、、
どなたかの時短になれば。

参考

https://akira-watson.com/android/screen-size.html
https://programming-cafe.com/programming/android/info-android/get-device-dp-size/

Discussion