web-dev-qa-db-ja.com

JavaコードからDIPで寸法を指定する正しい方法は何ですか?

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

Android:layout_width="10dip"

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

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

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

ピクセル* DisplayMetrics.density = dip

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

51
Pavel Lahoda

これを行う 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_SPCOMPLEX_UNIT_PTなど、使用できる他のタイプのリストがあります。 (int)型キャストを除外すると、浮動小数点数が取得されます。

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

91
sirhc

それはそこに正しい式です。 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
45
Roman Nurik

表示メトリック密度フィールドを使用すると、ディップとの間で変換するスケーリング係数を取得できます。 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;
9
Matt Stoker