次のフラグメントのように、DIPを使用してXMLレイアウトでインターフェイス要素の寸法を設定できることがわかりました。
Android:layout_width="10dip"
しかし、すべてのJavaインターフェイスは引数として整数を取り、DIPで次元を指定する方法はありません。これを計算する正しい方法は何ですか?
DisplayMetrics
クラスのプロパティ密度を使用する必要があると考えましたが、これは正しい方法ですか?
この式が常に正しいことを信頼できますか?
ピクセル* DisplayMetrics.density = dip
Androidのどこかに変換のためのユーティリティ関数はありますか?
これを行う 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)型キャストを除外すると、浮動小数点数が取得されます。
私は同じ問題に遭遇し、コードを突っついてこれを見つけました。
それはそこに正しい式です。 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
表示メトリック密度フィールドを使用すると、ディップとの間で変換するスケーリング係数を取得できます。 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;