Androidおよびdp単位でプログラム的に幅と高さを設定する


304

私がやっている:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

ドキュメントによると、幅と高さの単位(上記の両方で65)は「ピクセル」です。これをデバイスに依存しないピクセル、つまり「dp」にするにはどうすればよいですか?

回答:


541

表示倍率を使用して、それをdpsからピクセルに変換する必要があります。

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);

111
正しい変換は(int)(dps * scale + 0.5f)です。これは、フレームワーク全体で使用する式です。
Romain Guy

8
式はドキュメントにあります。詳細については、developer.android.com
guide / practices /…の

34
@RomainGuyは、あなたから変換するために、APIへのユーティリティー機能を追加してくださいすることができますdppx?ありがとう。
AlikElzin-kilaka 2013年

3
ここでdpsとは何ですか?「dpsを変数に解決できません」というエラーが表示されますか?どのタイプの「dps」を宣言する必要がありますか?
Deepak 2014

5
「dps」変数は、変換する入力値です。
Robby Pond

233

私はこれが古い質問であることを知っていますが、私はこの変換を実行するはるかにきれいな方法を見つけました。

ジャワ

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

コトリン

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)

8
これを行う方法を見つけるためによくやった。私はいくつかの場所で数式を繰り返すのが好きではありません!ありがとう。
darrenp 2013年

2
ない場合は、次の式で関数を作成
Sayka

1
@Kenobi DPからPXへの変換を行います。65上記のあなたはPXに変換したいDP値である
drspaceboo

7
これは受け入れられた答えであるべきであり、これらの数字(0.5)がどこからでも魔法のように来ている現在の答えではない
Johny19

1
@ Johny19 0.5は魔法ではありません。浮動小数点数を切り捨てるのではなく、最も近い整数に丸める方法です。詳細については、Robby Pondの回答に対する私のコメントを参照してください。
MarredCheese

38

要件を見ると、代替ソリューションもあります。コンパイル時にdpの次元を知っているようなので、リソースにdimenエントリを追加できます。次に、dimenエントリをクエリすると、この呼び出しで自動的にピクセルに変換されます。

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

そして、あなたのdimens.xmlは次のようになります:

<dimen name="dimen_entry_in_dp">72dp</dimen>

このアイデアを拡張すると、1dpまたは1spの値をdimenエントリとして格納し、その値をクエリして乗数として使用できます。このアプローチを使用すると、コードを数学的なものから隔離し、ライブラリに依存して計算を実行します。


戻り値は実際にはintなので、floatにキャストされることに注意してください。
CorayThan

動的であることは
まさしく

37

テストされた最も簡単な方法(そしてapi 1からでも機能します)は次のとおりです。

getResources().getDimensionPixelSize(R.dimen.example_dimen);

ドキュメントから:

rawピクセルのサイズとして使用する特定のリソースIDの次元を取得します。これは、戻り値がサイズとして使用するために整数ピクセルに変換されることを除いて、getDimension(int)と同じです。サイズ変換では、ベース値を丸め、ゼロ以外のベース値のサイズが少なくとも1ピクセルになるようにします。

はい、それは値を丸めますが、それほど悪くはありません(ldpiがあまり一般的でない場合、hdpiおよびldpiデバイスの奇数値に少し値を追加する必要があります)4dpを16(ピクセル)に変換するxxhdpiデバイスでテストしました本当。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.