エミュレータ・ベース(VBox)で作ってたアプリを、端末で実行したら拡大表示されてしまった。
いや、拡大表示っていうのは、正確じゃない。
画像表示は拡大されて、ボタン等は横幅が圧縮されてしまってる。
ちょうど、”小さな画面” に押し込まれた感じ。なんだけど…。
VBoxの画面サイズは、800x600
端末のタブレットも、800x600
画面サイズは同じなのに、これはどういうことなんだろ…?
画面サイズを調べる
原因は「端末の画面サイズ」だろうと予想がつく。
なぜなら、ボタン等の左右端は、画面端から一定の長さを保つようにしているから。
だから小さい画面になると、左右幅が圧迫されて横幅が小さくなってしまうんだ。
でも前述のように、端末は800×600のハズ…。
なにはともあれ、画面サイズをまず調べてみることにした。
画面サイズは、下記方法で取得できる。
◆Activityの場合
WindowManager wm = (WindowManager) getSystemService( Activity.WINDOW_SERVICE );
Display display = wm.getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
◆Viewの場合
WindowManager wm = (WindowManager) context.getSystemService( Context.WINDOW_SERVICE );
Display display = wm.getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
結果は…
width = 533
height = 400
やはり、画面サイズが小さいようだ。
とすると、アプリ側で画面サイズの設定が必要…ということなのかな?
実は必要、画面サイズ設定(解像度設定)
調べると、AndroidManifest.xml に supports-screens が必要らしい。
supports-screens は、アプリでサポートしている画面解像度を設定するようだ。
たとえば、下記のような感じ。
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true" />
</manifest>
それぞれの意味は…
largeScreens … ラージスクリーンのサポート
normalScreens … ノーマルスクリーンのサポート
smallScreens … スモールスクリーンのサポート
anyDensity … ピクセル密度を調整可能
ということのよう。
これらの設定がない場合、解像度設定は、SDK Version の設定(後述)に従うらしい。
そして、SDK Version の設定もない場合、すべてfalse となるらしい。
supports-screens もSDK Version もない…
その場合は、SDK 1.5相当のサポートとなり、normalScreens で動作することになる。
つまり、「端末がlargeScreens の解像度でも、normalScreens の解像度で動作」する。
──今回のような「小さな画面サイズ」になってしまうようだ。
PCに例えると、「17インチ・モニター(1024×768)で、15インチ設定(800×600)」にした感じかな。
それと、これには逆の現象もあるらしい。
本来、画面いっぱいに表示されるアプリが、小さく表示されてしまうようなんだ。
原因は同じで、supports-screens もSDK Version の設定もないせいで起きるみたい。
現在、作っているアプリは、800×480での動作を対象としている。
なので、下記を追加したことで、画面サイズの問題はひとまず解決。
<supports-screens
android:largeScreens="true"
android:anyDensity="true" />
SDK Version の設定
前記 supports-screens とは別の設定でも、画面サイズを設定できる。
別の設定とは、minSdkVersin もしくは targetSdkVersion の設定。
それぞれは…
minSdkVersino … 指定SDKバージョン以上で動作
targetSdkVersion … 指定SDKバージョンでのみ動作
…ということらしい。
なので正確には、画面サイズ設定ではない。
しかしこれらの設定をすると、SDKでサポートしている設定が supports-screens に設定されるため、同様の結果がえられるんだ。
今回、下記を追加したことでも、画面サイズの問題は解決した。
<uses-sdk android:minSdkVersion="4" />
※. 参考資料
http://developer.android.com/guide/practices/screens_support.html
未解決がひとつ…
さて。
画面サイズの問題は、supports-screens もしくは、minSdkVersion で解決した。
けれども、「画像表示が拡大されてしまう」不具合は直らなかった。
これはピクセル密度が関係した不具合で…
解決方法は、またページを改めて。
→「ピクセル密度ってナニよ?」
by the way…
ここらへんって、基本中の基本っていうか、すごく重要なことだと思うんだけど…。
手元にある緑本には記述が見当たらない。
なんだかなぁ…。
入門書だからこそ、解説してほしい事項なのになぁ。