[Android] スクリーンサイズを取得する

アプリの画面サイズを取得したい場合があります。タブレットとスマホで表示を変えたい
あるいはテキストの位置を正確に表示したいなど

画面サイズは getWindowInsets() を使って取得します

Android Studio
2024.1.1




Screen size

 

API29まで画面サイズを取得するには以下のようにしていましたが、これが非推奨になりました。
getDefaultDisplay()

 
API30からは getWindowInsets() を使います
これを使って、Status barとNavigation bar も調べられます

landscapeの場合はtop, bottomがleft, rightになる

WindowMetrics
ウィンドウやディスプレイのメトリクス(寸法やその他の関連情報)を取得するために使用されるクラス

Insets
Viewの内側にある空白領域を指し、コンテンツが表示されるエリアを調べられる

getWindowInsets
Androidでウィンドウのインセット情報を取得するために使用されるメソッド

getInsetsIgnoringVisibility
可視性に関係なくインセットのサイズを取得するメソッドで、システムUI要素(status bar, navigation bar など)が表示されているかどうかに関係なく、その領域のサイズがわかる
 

 

サンプルテストコード

 getWindowInsets()

を使ってサイズを計測してみましょう

MainActivity.java

エミュレータはPixel 8
Logcatでログを見てみます

解像度は
1080 x 2400
とわかります

1x1.trans - [Android] スクリーンサイズを取得する

 

Status bar/Title bar/Navigation bar

 

Title bar はもう使わないような感じですがあえて計測してみます
デフォルトでactivity_main.xmlにidが振られているのでそれを使ってレイアウトの縦横サイズを取得します。ただし、これはonCreate()のタイミングでは取れないのでfocusが変わったことろで取り出します。

また、EdgeToEdge は全画面をアプリが使えるようにしているので
EdgeToEdgeがはコメントアウトします

Logcat には

2400 – 2274 = 126(48dp)
これは、

Satatus bar(24dp)
Navigation bar(24dp)

を除いた分が
レイアウトエリアとなっているということです

1x1.trans - [Android] スクリーンサイズを取得する

Title barを表示させるにはThemeを変更します
res¥values¥themes
themes.xml

NoActionBar をはずします

1x1.trans - [Android] スクリーンサイズを取得する

Logcat には

Title bar は以下の計算からわかります

2274 – 2016 = 168(64dp)

Pixel8 ではこうなります

Pixel 8
dip scale 2.625
Resolution(dp) 1080 x 2400
Aspect Ratio 9 : 20
Size 6.2″
Status bar 63(24dp)
Title bar 168(64dp)
Navigation bar 63(24dp)

  

References:
WindowInsets | Android Developers
WindowMetrics | Android デベロッパー | Android Developers
Display
DisplayMetrics
 

シェアする

  • このエントリーをはてなブックマークに追加

フォローする