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

アプリの画面サイズを取得したい事が時々あります。タブレットとスマホで表示を変えたい。あるいはテキストの位置を正確に表示したいなど。画面のサイズと言っても、タイトルバーがあるか無いかで異なってくるので確認してみました。
 

Android Studio 3.0.1
Android 8.1.0

 



Screen Size

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

  • physical size of the display
    • 物理的なLCDのピクセルサイズですね
  • real display area
    • アプリケーション装飾を含む表示領域
    • getRealSize(Point), getRealMetrics(DisplayMetrics)でサイズを取得できる
  • application display area
    • アプリケーション装飾を除きapplication windowを含めた表示領域
    • getRectSize(Rect), getRectSize(Rect), getMetrics(DisplayMetrics)でサイズ取得できる

android screen size
 
Screen Sizeを取得するためには2通りあります。

  • DisplayクラスのgetRealSize(Point), getRectSize(Rect), getRectSize(Rect)
  • DisplayMetricsクラスのgetRealMetrics(DisplayMetrics), getMetrics(DisplayMetrics)
 

Display class

 
例えばgetRealSizeを使ってreal display areaのサイズを取得するにはこのようにします。
 
real display area

 
application display areaも同様です。

 

DisplayMetrics class

 
またDisplayMetricsでサイズを取得するにはこのようにします。
 
real display area

 
application display areaも同様です。

 

Layout area

 
さて、real display areとapplication display areはしかしながら実際使うレイアウト領域とは異なることがあります。Title barやStatus barそれにNavigation barもあります。
 
android screen size

実際にはこれらを除いた領域、レイアウトで使用するスクリーンサイズを取得したいのですが、これはLayoutから求めたり、Viewなどを最大にして画面に張り付けてそこから求めることもできます。
 

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

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

  • case 1: Status Bar + Title Bar + Navigation Bar
  • case 2: Status Bar + Navigation Bar
    • AppCompatActivity -> Activity 変更
  • case 3: Navigation Bar
    • AppCompatActivity -> Activity 変更
    • AndroidManifestのthemeをFullscreenに変更android:theme=”@android:style/Theme.NoTitleBar.Fullscreen”

Nexus 6P でサイズを取ってみた結果が下です。
 

case 1

case 2

case 3
 case 1 (pixel) case 2 (pixel)  case 3 (pixel)
 real display area 1440 x 2560 1440 x 2560 1440 x 2560
 application display area 1440 x 2392 1440 x 2392 1440 x 2392
 layout area 1440 x 2112 1440 x 2308 1440 x 2392

 
この結果からそれぞれのbarの高さが分かります。
 

height (pixel) dp
Status bar 84 24
Title bar  196 56
Navigation bar 168 48

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

Pixel 2XL Pixel XL Pixel 2 Pixel
Resolution(pixel) 1440 x 2880 1440 x 2560 1080 x 1920 1080 x 1920
Density 560dpi 560dpi 420dpi xxhdpi
dip scale 3.5 3.5 2.625 3
Resolution(dp) 411 x 822 411 x 731 411 x 731 360 x 640
Aspect Ratio 1 : 2 9 : 16 9 : 16 9 : 16
Size 5.99” 5.5″  5.0″ 5.0″
Status bar 84(24dp) 84(24dp) 63(24dp) 72(24dp)
Title bar 196(56dp) 196(56dp) 147(56dp) 168(56dp)
Navigation bar 168(48dp) 168(48dp) 126(48dp) 144(48dp)
Layout area(pix) 1440 x 2712 1440 x 2112 1080 x 1584 1080 x 1536

 

Nexus 6P Nexus 5X Nexus 4 Nexus S
Resolution(pixel) 1440 x 2560 1080 x 1920 768 x 1280 480 x 800
Density 560dpi 420dpi xhdpi hdpi
dp scale 3.5 2.625 2.0 1.5
Resolution(dp) 411 x 731 411 x 731 384 x 640 320 x 533
Aspect Ratio 9 : 16 9 : 16 3 : 5 3 : 5
Size 5.7” 5.2″ 4.7″ 4.0″
Status bar 84(24dp) 63(24dp) 48(24dp) 36(24dp)
Title bar 196(56dp) 147(56dp) 112(56dp) 84(56dp)
Navigation bar 168(48dp) 126(48dp) 96(48ddp) 0
Layout area(pix) 1440 x 2112 1080 x 1584 768 x 1024 480 x 680

 
Status bar: 24dp,
Title bar: 56dp,
Navigation Bar: 48dp
は決まっているようですが、同じピクセルでもDensityの違いで見え方もかわるということですね

 

サンプルテストコード

 
このコードでテストしました
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
となりました。
 


1440x2560

2000×3000

 
尚、リセットしないと元に戻りません、実機では危険なので自己責任でやりましょう。
 

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

 
References:
Display
DisplayMetrics
 

誤字脱字、意味不明で分からにゃイ、
などのご意見はこちらから mailフォーム

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


 


ページのトップへ戻る




シェアする

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

フォローする