hyoromoのブログ

最近はVRSNS向けに作ったものについて書いています

Android Pad対応方法

今までいくつかのPadを見てきましたが、今のところの共通点は以下のようになります。

  • Density Dpi が 160dpi(mdip)以下
  • 解像度は480×800以上

この事から分かるように、dpiが低く解像度を高くすることで携帯端末よりも大きいディスプレイを快適に使うための工夫がなされています。

ただし、この工夫のせいで本来 hdpi 扱いになるはずが mdpi として扱われるため。
中解像度用の画像が使われ、見栄えが悪くなるコンテンツがあります。
今回はそういったコンテンツのために、Android Pad で高解像度扱いで画像を表示さえる方法を書き残します。

必要な情報取得

端末のdpiとスクリーンサイズの最小値を取得します。

WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
display.getMetrics(displayMetrics);
int dpi = displayMetrics.densityDpi;

// スクリーンサイズの最小値を取得
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;
int mini;
if (height < width) {
    mini = height;
} else {
    mini = width;
}

設定すべきdpi値を取得

解像度に適したdpiを取得します。

int LOW_SCREEN_MINI_SIZE = 240;
int MEDIUM_SCREEN_MINI_SIZE = 320;

if (dpi <= DisplayMetrics.DENSITY_LOW) {
    if (mini <= LOW_SCREEN_MINI_SIZE) {
        mDpi = dpi;
    } else if (mini <= MEDIUM_SCREEN_MINI_SIZE) {
        mDpi = DisplayMetrics.DENSITY_MEDIUM;
    } else {
        mDpi = DisplayMetrics.DENSITY_HIGH;
    }
} else if (dpi <= DisplayMetrics.DENSITY_MEDIUM) {
    if (mini <= LOW_SCREEN_MINI_SIZE) {
        mDpi = DisplayMetrics.DENSITY_LOW;
    } else if (mini <= MEDIUM_SCREEN_MINI_SIZE) {
        mDpi = dpi;
    } else {
        mDpi = DisplayMetrics.DENSITY_HIGH;
    }
} else {
    if (mini <= LOW_SCREEN_MINI_SIZE) {
        mDpi = DisplayMetrics.DENSITY_LOW;
    } else if (mini <= MEDIUM_SCREEN_MINI_SIZE) {
        mDpi = DisplayMetrics.DENSITY_LOW;
    } else {
        mDpi = dpi;
    }
}

dpiを設定して画像読み込み

BitmapFactory.Options config = new BitmapFactory.Options();
config.inTargetDensity = mDpi;

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.hoge, config);