WindowInsetsを使わないでRealSizeからSystemUIの高さを求めているとChromebookで大変なことになる
かつて、WindowInsetsが扱えるようになる前、Kitkatとかの時代ですね。ステータスバーの高さやナビゲーションバーの高さを求める方法として、Display#getRealSize()を使う方法がありました。この方法は今でもある程度通用します。
かなりやっつけコードですが、以下のように、ルートViewのgetGlobalVisibleRect()
で取得したルートViewの表示領域と、displayのgetRealSize()
で取得した実際のディスプレイサイズを使って、rect.top
をステータスバーの高さと見なして、point.y - rect.bottom
をナビゲーションバーの高さを見なすというものです。
val density = resources.displayMetrics.density
binding.root.doOnLayout {
val rect = Rect()
it.getGlobalVisibleRect(rect)
val point = Point()
windowManager.defaultDisplay.getRealSize(point)
binding.realSize.text =
"""
RealSize:
StatusBar: ${rect.top / density}dp
NavigationBar: ${(point.y - rect.bottom) / density}dp
""".trimIndent()
}
ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { _, insets ->
window.decorView.onApplyWindowInsets(insets.toWindowInsets())
binding.insets.text =
"""
Insets:
StatusBar: ${insets.systemWindowInsetTop / density}dp
NavigationBar: ${insets.systemWindowInsetBottom / density}dp
""".trimIndent()
insets
}
比較用にWindowInsetsの値も表示させています。
まずはKitkatでの実行、WindowInsetsを扱えるのはLollipop以降なのでInsetsの方は表示されていませんが、StatusBar/NavigationBarの高さがとれていますね
Android 11で実行すると、WindowInsetsの値と一致しています。
ってことで、ひょっとしたらまだこういうコードが残っているアプリもあるかもしれないですね。
ではChromebookで実行してみましょう
はい、ディスプレイのRealSizeは物理ディスプレイのサイズですが、アプリ領域はウィンドウ化されているのでGlobalVisibleRectはウィンドウ内での領域情報ってことで、ディスプレイサイズからウィンドウのコンテンツ領域の高さを引いた値になるのですごく大きな値になります。
ってことで、ちゃんとWindowInsets使おうねって話でした。
Author And Source
この問題について(WindowInsetsを使わないでRealSizeからSystemUIの高さを求めているとChromebookで大変なことになる), 我々は、より多くの情報をここで見つけました https://qiita.com/ryo_mm2d/items/0bac30d6f458405e7cdc著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .