読者です 読者をやめる 読者になる 読者になる

hyoromoのブログ

iOS/AndroidもしくはCocos2dxネタを書いています

ステータスバーの高さを求めて...

ステータスバーの高さって端末毎に違いますよね?
低/中/高解像度毎に違うのは別に構わないのですが、Xperiaのように高解像度だけど他高解像度端末と異なるサイズなどあり、どうすりゃいいんだよ!と思ったけど、1つの解決策としてシステムアイコンのサイズを基準にすれば良さそうです。
今回はシステムからアイコン情報を取得する方法を説明します...と言っても、大した内容ではありませんが。

ステータスバーの高さ

解像度名 画面解像度(横×縦) ステータスバー高さ
標準low 240×320 19 13*1
標準medium 320×480 25
標準high(800) 480×800 38
Xperia 480×854 29

システムのアイコン取得方法

xml
@android:drawable/stat_notify_sync_noanim
java
int imgId = getResources().getIdentifier("stat_notify_sync_noanim", "drawable", "android");
Bitmap bmp = BitmapFactory.decodeResource(getResources(), imgId);

確認してみた

イキナリ挫折したのですが、リソースサイズが25×25しか用意されてない場合はスケールされた後のサイズがどうやっても取れませんでした。なので、今回は標準では解像度毎にアイコンが作り分けられている物を対象に検証しました...これは標準以外だとどうなってるか分からず怖いです
mdpihdpi
左がmedium、右がhigh。

結論

明確な取り方は無さそう。とりあえずアイコンを元に取って来れそうですが、デバイス依存なところが大きく怖いです。

副産物

android.R.drowable で取れるアイコン一覧を観覧するための簡単なアプリを作ってみました。
ちゃんと動作するかは分からない。
SystemImageView.apk ダウンロード

Viewから高さを求める方法 (追記:2010/06/19)

final View view = (View) findViewById(R.id.view);
view.post(new Runnable() {
    public void run() {
        Rect rect = new Rect();
        view.getWindowVisibleDisplayFrame(rect);
        int statusBarHeight = rect.top;
    }
});

エミュレーターのlowだと25px返されちゃってましたが、mediumとhighだと期待値が返って来て良い感じ。
イヤなのはViewを用意しないと取得できない点くらいです。

参考リンク(追記:2010/06/19)

Getting Height of Status and Title Bar -AndMobiDev

*1:たぶん