スクリーン独立のベストプラクティス

複数スクリーンサポートの目的は、どんなディスプレイでも実行出来て、どんなスクリーン仕様でも適切にきのうするアプリケーションを作る事です。

あなたはこれを簡単に実現できます。以下にクイックチェックリストがあります。

1.XMLレイアウトファイルにて、pixではなくdipを使う。
2.AbsoluteLayoutを使わない。
3.固定pixel値でコーディングしない。
4.ピクセル密度、および/もしくは、解像度特定のリソースを使う。

1.XMLレイアウトファイルにて、pixではなくdipを使う。
XMLレイアウトファイルで、layout_width,layout_heightを定義する際に、wrap_content,fill_parentもしくはdipを使う事で、そのスクリーンに適切なサイズで表示される事が保証されます。例えば、layout_width=”100dip”と設定されたあるViewは、HVGAの160dpiスクリーンでは100pixel、WVGAの240dpiスクリーンでは150pixelと計測されますが、物理的なサイズはほぼ同じになります。

2.AbsoluteLayoutを使わない。
AbsoluteLayoutはAndroid UI ツールキットによって提供されるレイアウトコンテナの一つです。他のレイアウトと異なり、AbsoluteLayoutは複数ディスプレイ対応に適さない、位置固定利用を義務付けています。したがって、AbsoluteLayoutはandroid1.5の頃に推奨されていました。

FrameLayoutを使ったり、子ビューにlayout_marginを設定する事で、殆ど同じ事が実現できます。この方法の方が、より柔軟で、複数スクリーン対応に適しています。

3.固定pixel値でコーディングしない。

パフォーマンス維持、およびコードをシンプルにする目的で、Android framework APIは寸法や座標を表現するのにpixelを基本単位として使用します。つまり、Viewの寸法は常にpixelコードで表現されているわけです。例えば、myView.getWidth()が10を返した場合、そのビューの幅は10pixelです。コードの中で、pixel値をスケールさせる必要がある事が良くあります。更に詳しくは以下を参照して下さい。

dipからpixelへの変換

座標をdipで表現して、後からpixelに変換しないと行けない事が良くあります。ユーザーが16pixel以上指を動かしたらスクロールジェスチャーを認識するアプリを想像してください。基本スクリーンでは、ユーザは16pixel/160dpi=2.5mm以上指を動かさないとスクロールさせられません。240dpiのhigh密度ディスプレイの場合は、16pixel/240dpi=1.7mmとなり、よりセンシティブなUIとなります。これを是正する為に、ジェスチャーの閾値はdipで表現し、後から具体的なpixel値に変換する必要があります。

// The gesture threshold expressed in dip
private static final float GESTURE_THRESHOLD_DIP = 16.0f;

// Convert the dips to pixels
final float scale = getContext().getResources().getDisplayMetrics().density;
mGestureThreshold = (int) (GESTURE_THRESHOLD_DIP * scale + 0.5f);

// Use mGestureThreshold as a distance in pixels

android.util.DisplayMetrics.densityフィールドはスクリーンの密度に合わせてdipをpixelに変換する際に使う、スケール係数を特定します。カレントスクリーンのmetricsにはContextか、Activityを経由してアクセスする事ができます。medium(160dpi)密度のスクリーンでは、DisplayMetrics.densityは”1.0″となり、high(240dpi)では”1.5″となります。詳しくはDisplayMetricsクラスのドキュメントを参照して下さい。

事前リサイズ設定値を使う
ViewConfigurationクラスはandroid frameworkで使われる、殆どの共通な距離、速度、時間にアクセスする事ができます。例えば、frameworkでスクロール閾値として使用されるpixelで表現された距離は以下で得られます。

ViewConfiguration.get(aContext).getScaledTouchSlop()

getScaledプリフィックスで始まるメソッドはカレントスクリーンの密度にかかわらず、適切に表示されるpixel値を返す事が保証されています。

4.は次回書きます。。。

androidドキュメント和約「様々なスクリーンのサポートについて」その1
androidドキュメント和約「様々なスクリーンのサポートについて」その2
androidドキュメント和約「様々なスクリーンのサポートについて」その3
androidドキュメント和約「様々なスクリーンのサポートについて」その4
androidドキュメント和約「様々なスクリーンのサポートについて」その5
androidドキュメント和約「様々なスクリーンのサポートについて」その6
androidドキュメント和約「様々なスクリーンのサポートについて」その7
androidドキュメント和約「様々なスクリーンのサポートについて」その8

 

2 Responses to androidドキュメント和約「様々なスクリーンのサポートについて」その5

  1. […] androidドキュメント和約「様々なスクリーンのサポートについて」その5 […]

  2. […] androidドキュメント和約「様々なスクリーンのサポートについて」その5 […]

コメントを残す

メールアドレスが公開されることはありません。