2012/03/06

Android:マルチ画面対応のための画面サイズ修飾子sw<N>dp

今までは、リソースの画面サイズセットとしてsmall、normal、large、xlargeが用意され
ていました。
大画面向けリソースとしてlayout-xlarge、小画面向けリソースとしてlayout-smallとい
った具合で使用されています。

しかし、今やタブレットといっても7インチや10インチ等様々なサイズがあり、GalaxyNote
など大画面のスマートフォンも登場しています。
さらにはAndroid4.0の登場により、スマートフォンとタブレット両方を意識したアプリケ
ーションの作成が可能になり、画面サイズに応じてマルチペインに切り替える
といったギミックまで可能になりました。

マルチ画面のサポートがより複雑化していく中、サイズセットによるサイズ修飾子の仕組
みが追いつけていないのが現状です。

Android3.2以降、リソースのサイズセットであるsmall、normal、large、およびxlargeの
使用は非推奨となりました。
Android3.2以降では sw<N>dp, w<N>dp, h<N>dpの設定修飾子を使って、レイアウトリソー
スに必要となる画面幅を定義する方法が導入されました。



・w<N>dp (width N dp)
アプリ描画領域の横幅が<N>dpより大きい場合に参照されるリソースです。
画面の向きに依存する為、画面回転により基準となる横幅は変化します。
縦方向画面時の最小幅を気にする場合はw<N>dpが有効です。
例えば「縦画面でもある程度の領域が確保できていればマルチペインにしたい」といった
場合には有効です。


・h<N>dp (height N dp)
アプリ描画領域の高さが<N>dpより大きい場合に参照されるリソースです。
画面の向きに依存する為、画面回転により基準となる高さは変化します。
w<N>dpと似たメリットがありますが、高さについてはユーザのスクロール操作によって解
決される問題がほとんどで、レイアウトデザインが重視するのは横幅であることがほとん
どなので、それほど重要な要素ではなく利用するシーンは少ないでしょう。


・sw<N>dp (smallest width N dp)
アプリ描画領域で最も短い辺の長さが<N>dpより大きい場合に参照されるリソースです。
画面の向きには依存しない為、画面回転により基準となる値は変化しません。
これは、画面の向きに関わらずアプリのUIデザイン上、必ず必要な横幅と考えることもで
きます。

例えば、values-sw500dpのリソースフォルダを用意することで、アプリ描画領域の最短辺
の長さが500dp以上である場合に参照されるリソースを定義できます。

注意しなければならないのは、<N>値は解像度ベースの縦横サイズではなく、
アプリ描画領域ベースの縦横サイズを指定する必要があります。
解像度が100×100でもアプリ描画領域が50×50しかない場合はvalues-sw100dpの
リソースフォルダを用意しても参照されません。
参照されるにはvalues-sw50dpのリソースフォルダを用意する必要があります。

この仕組みより、レイアウトは一般的な画面サイズ(small,large)ではなく、より詳細な
画面サイズに基づいた選択が可能となりました。
開発者は、より細かく画面サイズによるリソースの管理を行うことが可能になります。



●リソースの優先順位
新しいサイズ修飾子の優先順位は下記となります。
# 公式の資料を探しましたが見つからず、手元にある環境での動作確認結果となります。

xxx-h<N>dp > xxx-sw<N>dp > xxx-w<N>dp > xxx(デフォルト)


●参考となる画面サイズ
端末ごとの一般的なサイズは下記となります。
•320dp(mhdpi): スマートフォン (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc)
•480dp(mhdpi): 5型 Streak Tablet (480x800 mdpi).
•600dp(mhdpi): 7型 Tablet (600x1024 mdpi).
•720dp(mhdpi): 10型 Tablet (720x1280 mdpi, 800x1280 mdpi, etc).


以上です。

2012/03/07 修正:x<N>dpの説明で"画面幅"は語弊を招くため"アプリ描画領域"に修正