お題
端末ごとにAPIから取得する画像サイズを決定するため、端末のDPIを取得したい。
なお対象は XHDPI
, XXHDPI
, XXXHDPI
とする
対応
密度自体はDisplayMetrics.densityで取得できる。
val density = context.resources.displayMetrics.density
こちらの方が良いかも。中身は同じ。
val density = Density(context).density
こうすると 2.0f
や 3.0f
などのFloat値が返却され、デフォルトの160dpiを基準にして端末がその何倍かがわかる。
また densityDpi
を使うと端末のDPIが分かる
val densityDpi = context.resources.displayMetrics.densityDpi
ただし、このサイズは AndroidのAPIレベルと共に増加し、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()