1. ホーム
  2. android

[解決済み] pxからdp、dpからpxのアンドロイドの計算式

2022-05-03 23:45:22

質問

密度独立ピクセルに対する可変ピクセル量、またはその逆の計算をしようとしています。

この式 (px to dp): dp = (int)(px / (displayMetrics.densityDpi / 160)); はゼロで割るため、小型端末では動作しません。

これは、私のdp to pxの計算式です。

px = (int)(dp * (displayMetrics.densityDpi / 160));

どなたか、ご指摘をお願いします。

どのように解決するのですか?

注:上記で広く使われている解決策は displayMetrics.density . しかし、ドキュメントには、この値はスクリーンの「バケット」で使用される丸められた値であると説明されています。例えば、私のNexus 10では、実際の値は298dpi (real) / 160dpi (default) = 1.8625 であるところ、2が返されました。

要件によっては、正確な変換が必要な場合もありますが、その場合は次のようにします。

[編集] これはAndroidの内部dpユニットと混用するためのものではありません。なぜなら、これはもちろんまだスクリーンバケットに基づいているからです。異なるデバイスで同じ実サイズをレンダリングするユニットが必要な場合に使用します。

dpをpixelに変換します。

public int dpToPx(int dp) {
    DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
    return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));     
}

pixelをdpに変換する。

public int pxToDp(int px) {
    DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics();
    return Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
}

xdpiとydpiのプロパティがあるので、区別したいかもしれませんが、これらの値が大きく異なるようなまともなディスプレイは想像できませんので注意してください。