2012/08/25

Android:ロングスクリーンと判断される基準

スクリーンがlongかnotlongかの判断は下記の式で決定されるようです。

  isLong = ((画面サイズの長い方*3)/5) >= (画面サイズの短い方-1))

例えば、800px×1280pxの端末の場合下記の判定式に置き換えられます。

  (1280*3)/5 >= 800-1

結果、notlongな端末と判断されます。


ただし、実際にはデコレーション領域を除いたサイズが参照されます。
ナビゲーションバー領域のサイズが減算されてた値が使用されます。
Nexus7だと、ナビゲーションバーの位置が画面の向きに依存します。

 port : 基本サイズ(x=800px, y=1280px), 参照サイズ(x=800px, y=1205px)


land : 基本サイズ(x=1280px, y=800px), 参照サイズ(x=1280px, y=736px)


該当するソースコードは下記です。

・com.android.server.wm.WindowManagerService.reduceConfigLayout()
// Is this a long screen?
if (((longSize*3)/5) >= (shortSize-1)) {
    // Anything wider than WVGA (5:3) is considering to be long.
    screenLayoutLong = true;
} else {
    screenLayoutLong = false;
}

"long, notlongは画面アスペクト比に依存するもので、画面の向きには依存しない"とDevelopersSiteに記載があります。
http://developer.android.com/guide/topics/resources/providing-resources.html
This is based purely on the aspect ratio of the screen (a "long" screen is wider). This is not related to the screen orientation.
でも、Nexus7のようなナビゲーションバーが画面の向きで変化する端末だと、
場合によってはこの前提が崩れてしまうのでは...

以上です。