〈kotlin〉Android studio使い方メモ14:DisplaySize

金宏和實さんの「作ればわかる!Androidプログラミング kotlin対応」を参考に
Android studioでkotlinを使ってAndroidアプリ作成。

画面をタッチした位置によって違う音を鳴らすために
ディスプレイサイズを取得するしたかったが、
DefaultDisplayが非推奨になっていたため代わりの取得方法を調べた。

従来のコード

今回は高さが知りたかった。

private var screenHeight: Int = 0

val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val display: Display = windowManager.defaultDisplay
val size = Point()
display.getSize(size)
screenHeight = size.y

windowManagerのdefaultDisplay、getSizeが非推奨で、
このままでも動作はしたがコードには取り消し線がついた。


windowMetricsを使う

val windowMetrics = windowManager.getCurrentWindowMetrics()
val height = windowMetrics.bounds.height()

val insets: Insets = windowMetrics.windowInsets
    .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
val NavigationBar: Int = insets.bottom
screenHeight = ScreenHeight - NavigationBar

getCurrentWindowMetrics()で今のウィンドウの大きさの情報を取得。
boundsで取得したいものを指定した。
ただし従来の方法ではアプリの起動範囲の高さが取得できていたが、
この方法ではナビゲーションバーも含むウィンドウ全体の高さで取得する。
windowInsetを使用するとそれぞれのバーの大きさが取得できるため、
必要に応じてバーの高さ分を引いて補正する。
(今回はナビゲーションバーだけ引いてみた。)


実機で試したらこれで正しく位置が取得できていたが、
他の端末でもちゃんとできるだろうか…。

参考https://developer.android.com/reference/kotlin/android/view/WindowMetrics?hl=ja
  https://developer.android.com/reference/android/view/WindowInsets