前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

Android 端末DPIの取得

お題

端末ごとにAPIから取得する画像サイズを決定するため、端末のDPIを取得したい。
なお対象は XHDPI , XXHDPI , XXXHDPI とする

対応

密度自体はDisplayMetrics.densityで取得できる。

val density = context.resources.displayMetrics.density

こちらの方が良いかも。中身は同じ。

val density = Density(context).density

こうすると 2.0f3.0f などのFloat値が返却され、デフォルトの160dpiを基準にして端末がその何倍かがわかる。 また densityDpi を使うと端末のDPIが分かる

val densityDpi = context.resources.displayMetrics.densityDpi

ただし、このサイズは AndroidAPIレベルと共に増加し、DENSITY_260 から DENSITY_XXXHDPI(=640)まで10分割ほどに細分化されており、サーバー側のキャッシュヒット率などを考慮するとお題の通りの3つくらいに抑えたい。ということで丸めてしまうことにする

  //DPIを取得
  val densityDpi = context.resources.displayMetrics.densityDpi

  //近いDPIに寄せる(丸め)
  val density = when {
      densityDpi < DisplayMetrics.DENSITY_XXHIGH -> DisplayMetrics.DENSITY_XHIGH
      densityDpi < DisplayMetrics.DENSITY_XXXHIGH -> DisplayMetrics.DENSITY_XXHIGH
      else -> DENSITY_XXXHIGH
  }
  //スケールを得る
  val scale = density / DisplayMetrics.DENSITY_DEFAULT.toFloat()

参考

DisplayMetrics  |  Android Developers