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

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

実際にアプリで使える画面サイズとスクリーン全体のサイズは異なり Status bar、Title bar、Navigation bar を考慮しないといけません。

Android Studio
2021.1.1

 




Display

 
Display | Android Developersでは表示領域として以下の3つについて説明されています。

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

physical size of the display

  • 物理的な画面のピクセルサイズ

real display area

  • Status bar,、Title bar、Navigation barなどのアプリケーション装飾を含む表示領域

application display area

  • アプリケーション装飾を除きapplication windowを含めた表示領域

 

 

Screen size

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


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


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

 

Layout area

 
アプリで実際使えるレイアウト領域は、Screen sizeからTitle barやStatus barそれにNavigation barを差し引いた領域になります。

これはLayoutから求めたり、Viewなどを最大にして画面に張り付けてそこから求めることもできます。
 


 
この時のレイアウトファイル
activity_main.xml


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


Status barとNavigation barはgetWindowInsets()で取り出せました。

Title bar はこのLayout area を使って Title barの有無でその差分から計算できます。
Title barを非表示するにはAppCompatActivityをActivityに変更するか
ThemeでNoActionBarを選択するとできます。

Pixel 4 XL height (pixel)
Title bar 無し 2700
Title bar 有り  2504
Title bar 196(56dp)

 
Googleの端末で Portraitではこのようになっていました。

Pixel 3a Pixel 3XL  Pixel 4 Pixel 4XL
Resolution
(pix)
1080 x
2220
1440 x
2960
1080 x
2280
1440 x
3040
dip scale 2.75 3.5 2.75 3.5
Resolution(dp) 393 x 807 411 x 846 393 x 829 411 x 869
Aspect Ratio 9 : 18.5 9:18.5 9 : 19 9 : 19.5
Size 5.6″ 6.3″ 5.7″ 6.3″
Density 441dpi 560dpi 440dpi 560dpi
Status bar 66(24dp) 172(49dp) 171(62dp) 172(49dp)
Title bar 154(56dp) 196(56dp) 154(56dp) 196(56dp)
Navigation bar 132(48dp) 168(48dp) 132(48dp) 168(48dp)

(注)実機での実測テストをしていないものもあります

 

サンプルテストコード

 
このコードでテストしました。
Activity と AppCompatActivityの2ケースでテスト

MainActivity.java


 
activity_main.xml

 

Appendance

 
physical size of the display:
ReferenceのDisplayの中にある
physical size of the displayはどうすれば取り出せるのでしょう。
adb コマンドにwmがあるので、おそらくwindow managerのことでしょうか


何気にそれらしい値が出てきました。

これを使うと任意のスクリーンサイズを試せるようです。
例えばadb shell wm size 2000×3000 とすると2000×3000の画面をエミュレートできるわけです。


Physical sizeは変わりませんがOverride sizeとして設定値が返ってきました。画面も大きくなっています
Display, DisplayMetricsでのサイズも
2000×3000
となりました。
 
尚、リセットしないと元に戻りません、実機では危険なので自己責任でやりましょう。
 


 
メーカーはこんなことを想定していないので、メモリ不足や様々な想定外の問題で落ちたり、復旧困難に陥る可能性があります。

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

シェアする

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

フォローする