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

Android7

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

Android Studio 2.2.3
Android 7.1.1

 

sponsored link

Screen Size

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

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

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

 

Display

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

 
application display areaも同様です。

 

 

DisplayMetrics

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

 
application display areaも同様です。

 

Layout area

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

実際にはこれらを除いた領域、レイアウトで使用するスクリーンサイズを取得したいのですが、これは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
    • 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)
Status bar  168
Title bar  196
Navigation bar  168

但し、これはあくまでNexus6Pのdefaultでの値です。(変更可能なので)
テスト用のコードです
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