プログラムでLayoutParamsの高さを密度に依存しないピクセルとして設定します


123

LayoutParamsの高さ/幅を密度に依存しないピクセル(dp)として設定する方法はありますか?プログラムで設定した場合、高さ/幅はピクセル単位であり、dpではないようです。

回答:


271

ディップ値をピクセルに変換する必要があります:

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());

私にとってこれはトリックです。


10
getActivity()。getResources()。getDimension(resourceID)が正しい変換操作を実行すると思います。
StErMi 2012年

3
私にとってはうまくいきますが、上の方法とxmlを使用してImageViewの幅/高さを設定した場合は異なります。XMLでは85dpを設定していますが、上記の方法では同じサイズを生成するために「75」が必要です。なぜだと思いますか?
Dirk

1
@Dirkプログラムで設定すると、パディング/マージンの問題が発生する可能性があります(通常、コードで設定するときにパディングを自分で指定する必要があります)。XMLまたはコードでdpを設定しても、違いはありません。
ティアゴ

11
 public static int getDPI(int size, DisplayMetrics metrics){
     return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;        
 }

このような関数を呼び出し、

DisplayMetrics metrics;
metrics = new DisplayMetrics();         
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int heigh = getDPI(height or width, metrics);

それは……本当に間違っている。固定数の密度のみをサポートするようにハードコーディングしました。密度スケーリング係数でスケーリングする場合は、developer.android.com / reference / android / util /を乗算します。これも、(サイズ* metrics.densityDpi)/ DisplayMetrics.DENSITY_DEFAULTを実行する場合と同じです。
ハックボット

1
はい、あなたの新しい答えは合理的です。または、先ほど述べたように、metrics.densityを掛けます。それが目的です。
ハックボット

6

複数回使用される可能性があるため:

public static int convDpToPx(Context context, float dp) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}

通常、複数の値を変換する必要があるため、変換率を使用する方が実際的です。変換率は変わらないため、処理時間が少し節約されます。

/**
 * Get conversion rate from dp into px.<br>
 * E.g. to convert 100dp: px = (int) (100 * convRate);
 * @param context e.g. activity
 * @return conversion rate
 */
public static float convRateDpToPx(Context context) {
    return context.getResources().getDisplayMetrics().densityDpi / 160f;
}

5

これが私のスニペットです:

public class DpiUtils {

    public static int toPixels(int dp, DisplayMetrics metrics) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
    }

}

どこ DisplayMetrics metrics = getResources().getDisplayMetrics()


0

答えは解決されませんでした。ビューの高さはまだオフのままです。私はこれでうまくいきました、それはうまくいきます:

protected int dp2px(int dp){
    final float scale = getResources().getDisplayMetrics().density;
    return (int) (dp * scale + 0.5f);
}

そして、逆にしたい場合は、dpへのピクセル...

protected float px2dp(float px){
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    float dp = px / (metrics.densityDpi / 160f);
    return Math.round(dp);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.