Phone UIとTablet UIの判別方法がよくわからない(´・ω・`)


未だによくわかってない(´・ω・`)

高解像度の端末用にゲームの画面を拡大しようとしていてあることに気づく。

novo7 advanced(4.0.4)
novo7

sol25(4.4.2)
sol25

ナビゲーションバーの位置が違う( ;・´ω・`) ナニコレ…


ぐぐってみたらPhone UIとTablet UIという違いがあるのかΣ(゚∀゚;)

これどうやったら違いを判別出来るのよとぐぐったがよくわからない(´・ω・`)
そもそもピクセルとかdpiとかdipという言葉を何となくわかったつもりでは
あったが実は全然理解出来てないことが発覚Σ(゚∀゚;)

取り敢えず
DisplayMetrics
スマートフォンと画面解像度・ピクセル密度
に目を通して何となく分かったつもりになったけど、
そらで説明しろと言われると出来ないと思うw

build.propのro.sf.lcd_densityをいじくると切り替えられるらしい…
これは判別とは関係ないな。
Nexus 7をタブレットUIで使う方法。
カーネル入替なしでどれだけできるか
LCD densityをいじってXperiaの情報量を増やす


更にぐぐっていくとAndroidのソースでの判別式が(・∀・)
Ice Cream Sandwich を Tablet 向け、Phone 向けにビルドする方法

PhoneWindowManager.javaの

int shortSizeDp = shortSize
                * DisplayMetrics.DENSITY_DEFAULT
                / DisplayMetrics.DENSITY_DEVICE;

mStatusBarCanHide = shortSizeDp < 600;

でmStatusBarCanHideがtrueならphone UIらしい。
しかしよくわからない(ノ∀`)

同じブログの他のエントリを読む。
Android 4.4 ( KitKat ) の Phone UI と Tablet UIでは

int shortSizeDp = shortSize 
                * DisplayMetrics.DENSITY_DEFAULT
                / density;

という式があった。shortSizeが短辺でDisplayMetrics.DENSITY_DEFAULTが160と
いうことはわかったがdensityであれ?っとなる。純粋にdensityというと一桁の数値
なのでそれを代入すると600以下になることはあり得ないような…

metrics.densityDpiで割るとちょうど良いような感じがするので試してみたら、
上手く行った…っぽい。auの端末一覧にある数値を幾つか当てはめてみたら
タブレットらしいASUS MeMO Pad 8 AST21が1200×160/320=600でそれ以外は
ほとんど360とかで合ってる…っぽい。

Libオブジェクトというグローバルオブジェクトのようなゴテゴテのstatic変数の
固まりを使っているので全然オブジェクト志向じゃないプログラムをしているのが
ばれてしまうが、うちでは起動時に

DisplayMetrics metrics = new DisplayMetrics();
Lib.getWindowManager().getDefaultDisplay().getMetrics(metrics);

int shortSize = Lib.getCurrentWidth()<Lib.getCurrentHeight() ? Lib.getCurrentWidth():Lib.getCurrentHeight();
int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT / metrics.densityDpi;
Lib.setmNavigationBarCanMove(shortSizeDp < 600);

みたいな感じにして判別箇所でif(Lib.ismNavigationBarCanMove())するようにした。
一応機能しているっぽいけど、本当に正しいのかどうかよくわからない(ノ∀`)

試してないけど、これでも判別は出来るのかな?
タブレットとスマートフォンで処理やレイアウトを切り替える