ステータスバーの高さを取得する方法

Displayクラスを使用すると、画面の高さや幅を取得することができますが、これは画面全体のものです。
このためステータスバーの高さまで含みます。

ステータスバーの高さを得るメソッドなどは今のところ(Android2.3)存在しません。

おおよその目安

ldpi19px0.75
mdpi25px1
hdpi38px1.5
xhdpi50px2

表示領域の上部の位置を使用すると、ステータスバーの高さとなります。

[参考記事] 画面解像度などディスプレイの情報を取得する方法
[参考記事] タイトルバーやステータスバーを非表示にする方法

スポンサーリンク

Rect rect= new Rect();
Window window= activity.getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight= rect.top;
View view = (View) findViewById(R.id.view);
Rect rect = new Rect();
view.getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;

ただし端末によってはステータスバーが下に存在するものがあります。
また端末によっては上下にではなく横にステータスバーを配置する端末も出てくるかもしれません。

描画領域のサイズを得る目的なら

int height = rect.bottom - rect.top;
int width = rect.right - rect.left;

getWindowVisibleDisplayFrame は描画が完了していないと取得することができません。
このためコード内での使用例は次のようになります。

View view = (View) findViewById(R.id.view);
view.post(new Runnable(){
  public void run(){
    Rect rect= new Rect();
    Window window = getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(rect);
    int statusBarHeight= rect.top;
    int contentViewTop= 
      window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
    int titleBarHeight = contentViewTop - statusBarHeight;
    if(titleBarHeight < 0){
      titleBarHeight = 0;
    }

    // ステータスバーの高さ
    Log.d(TAG, "-------statusBarHeight-- "+statusBarHeight);
    // タイトルバーの高さ
    Log.d(TAG, "-------titleBarHeight -- "+titleBarHeight);
  }
});

起動時にステータスバーの高さを取る方法として、解像度から振り分けを行う方法がありますが、解像度でステータスバーの高さが固定という保証はありません。
実際にIS03ではこの方法はできないようです。

private static final int LOW_DPI_STATUS_BAR_HEIGHT = 19;
private static final int MEDIUM_DPI_STATUS_BAR_HEIGHT = 25;
private static final int HIGH_DPI_STATUS_BAR_HEIGHT = 38;

public void onCreate(Bundle savedInstanceState) {
  ………………
     ………
  ………………

  DisplayMetrics displayMetrics = new DisplayMetrics();
  ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displayMetrics);

  int statusBarHeight;
  switch (displayMetrics.densityDpi) {
    case DisplayMetrics.DENSITY_HIGH:
      statusBarHeight = HIGH_DPI_STATUS_BAR_HEIGHT;
      break;
    case DisplayMetrics.DENSITY_MEDIUM:
      statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
      break;
    case DisplayMetrics.DENSITY_LOW:
      statusBarHeight = LOW_DPI_STATUS_BAR_HEIGHT;
      break;
    default:
      statusBarHeight = MEDIUM_DPI_STATUS_BAR_HEIGHT;
  }
}

getDisplayMetrics().densityの値から、タイトルバーを計算で取得する方法もあります。

int statusBarHeight = Math.ceil(25 * context.getResources().getDisplayMetrics().density);

getDisplayMetrics().densityの値は
ldpi=0.75
mdpi=1
hdpi=1.5
xhdpi=2
なので、正しい値が取れます。

関連記事

スポンサーリンク

NOW関数 現在の日付を求める

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る