52

次のフラグメントのように、DIPを使用してXMLレイアウトでインターフェイス要素の寸法を設定できることがわかりました。

android:layout_width="10dip"

ただし、すべてのJavaインターフェイスは引数として整数を取り、DIPでディメンションを指定する方法はありません。これを計算する正しい方法は何ですか?

クラスのプロパティ密度を使用する必要があると思いましDisplayMetricsたが、これは正しい方法ですか?

この式が常に正しいことを信頼できますか?

ピクセル*DisplayMetrics.density= dip

Androidのどこかに変換用のユーティリティ関数はありますか?

4

4 に答える 4

92

これを行うために構築された既存のユーティリティメソッドがありますTypedValue.applyDimensions(int, float, DisplayMetrics)

使用方法は次のとおりです。

// returns the number of pixels for 123.4dip
int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
                     (float) 123.4, getResources().getDisplayMetrics());

上でリンクしたページにある、を含むCOMPLEX_UNIT_SP、 それで使用できる他のタイプのリストがあります。COMPLEX_UNIT_PT(int)型キャストを除外すると、浮動小数点数が取得されます。

私は同じ問題に遭遇し、コードをざっと見てこれを見つけました。

于 2010-04-21T14:26:08.273 に答える
46

それが正しい公式です。DisplayMetrics.density静的メンバーではありませんが、あなたがほのめかした同じドキュメントによると、正しい使用法は次のとおりです。

// Maybe store this in a static field?
final float SCALE = getContext().getResources().getDisplayMetrics().density;

// Convert dips to pixels
float valueDips = 16.0f;
int valuePixels = (int)(valueDips * SCALE + 0.5f); // 0.5f for rounding
于 2010-02-10T18:11:30.790 に答える
9

ディスプレイ メトリック密度フィールドを使用して、ディップとの間で変換する倍率を取得できます。Math.round メソッドを使用して、キャストや 0.5 の追加を必要とせずに float から int に変換します。

// Converting dips to pixels
float dips = 20.0f;
float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = Math.round(dips * scale);

// Converting pixels to dips
int pixels = 15;
float scale = getContext().getResources().getDisplayMetrics().density;
float dips = pixels / scale;
于 2011-04-26T21:17:31.480 に答える
5

values/dimens.xmlコードでディメンションを定義するのではなく、代わりにファイルを使用するのが最善の方法だと思います。次のように、いつでも目的の単位で寸法を定義できます。

<dimen name="my_layout_height">120dp</dimen>

そして、次のようにアクティビティでこれを参照します。

getResources().getDimensions(R.dimen.my_layout_height);

これは、必要な変換を行った後にピクセルを返します。もちろん、次のような他の XML でこれを参照することもできます。

android:layout_width="@dimen/my_layout_height"
于 2014-03-06T10:15:51.620 に答える