page.title=さまざまな画面密度のサポート parent.title=複数画面のデザイン parent.link=index.html trainingnavtop=true previous.title=さまざまな画面サイズのサポート previous.link=screensizes.html next.title=順応性のある UI フローの実装 next.link=adaptui.html @jd:body

このレッスンでの学習内容

  1. 密度非依存ピクセルを使用する
  2. 代替ビットマップを生成する

関連ドキュメント

試してみる

このレッスンでは、異なるリソースを生成し、かつ解像度非依存単位を使用して、異なる画面密度をサポートする方法について学習します。

密度非依存ピクセルを使用する

レイアウトを設計する際に回避すべきよくある落とし穴の 1 つとして、絶対ピクセルを使用して距離やサイズを定義することがあります。ピクセルを使用してレイアウトのサイズを定義すると、画面によってピクセル密度が異なるため、問題が起こります。したがって、同じピクセル数では、デバイスが異なる場合に物理サイズが異なる可能性があります。そのため、サイズを指定する場合は、常に dp 単位や sp 単位を使用します。dp とは、1 ピクセルの物理サイズが 160 dpi に相当する密度非依存ピクセルです。sp も基本単位は同じですが、ユーザーの優先テキスト サイズによってサイズが決まるので(スケール非依存ピクセル)、テキスト サイズを定義する際にはこの単位を使用する必要があります(ただし、レイアウト サイズには絶対に使用しないこと)。

たとえば、2 つのビューの間にスペースを挿入する場合は、px ではなくて dp を使用します:

<Button android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/clickme"
    android:layout_marginTop="20dp" />

テキスト サイズを指定する場合は、常に sp を使用します:

<TextView android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="20sp" />

代替ビットマップを生成する

Android は、画面密度がさまざまなデバイスで動作するため、それぞれの汎用密度バケット(低密度、中密度、高密度、超高密度)に合わせてビットマップ リソースを生成する必要があります。そうすることで、すべての画面密度で画質とパフォーマンスが向上します。

これらの画像を生成するには、ベクター形式の未加工リソースから、次のサイズ スケールを使用して密度別に画像を生成する必要があります:

つまり、200×200 画像(xhdpi デバイス用)を生成する場合、同じリソースを 150×150 画像(hdpi デバイス用)、100×100 画像(mdpi デバイス用)、75×75(ldpi デバイス用)でも生成する必要があります。

さらに、生成した画像を res/ 下の適切なサブディレクトリに配置することで、アプリが動作するデバイスの画面密度に基づいて、自動的に適切な画像が表示されます:

MyProject/
  res/
    drawable-xhdpi/
        awesomeimage.png
    drawable-hdpi/
        awesomeimage.png
    drawable-mdpi/
        awesomeimage.png
    drawable-ldpi/
        awesomeimage.png

また、@drawable/awesomeimage を参照する場合は常に画面の dpi に基づいて、適切なビットマップが選択されます。

アプリ用のアイコン アセットを作成するためのヒントとガイドラインについては、アイコン設計のガイドラインをご覧ください。