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

アプリの画面サイズを取得したい事が時々あります。タブレットとスマホで表示を変えたい。あるいはテキストの位置を正確に表示したいなど。実際にアプリで使える画面サイズは Status bar、Title bar、Navigation bar を考慮しないといけません。

Android Studio 4.1.3
API 30

 

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

Display

 
Display | Android Developersでは表示領域として以下の3つについて説明されています。
as413k m42 - [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 3 Pixel 3XL  Pixel 4 Pixel 4XL
Resolution
(pix)
1080 x
2160
1440 x
2960
1080 x
2280
1440 x
3040
dip scale 2.75 3.5 2.75 3.5
Resolution(dp) 393 x 785 411 x 846 393 x 829 411 x 869
Aspect Ratio 9 : 18 9:18.5 9 : 19 9 : 19.5
Size 5.46″ 6.3″ 5.7″ 6.3″
Density 440dpi 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
 

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから 問合せ

ブックマークしておくと便利です このエントリーをはてなブックマークに追加

 

アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

TECH ACADEMY
Androidアプリコース



Code Camp
現役エンジニアによるオンラインプログラミングスクール【CodeCamp】


直接(ネットで)誰か分かる人に聞いた方が早く解決して、上達も早いと思います。



侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


シェアする

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

フォローする