web-dev-qa-db-ja.com

アンドロイドとプログラムで幅と高さをdp単位で設定

私がやっている:

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

文書によれば、幅と高さの単位(上の両方で65)は "ピクセル"です。これをどうやってデバイスに依存しないピクセル、つまり "dp"にするのですか?

279
SK9

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

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

私はこれが昔からの質問であることを知っていますが、私はこの変換を行うためのはるかに優れた方法を見つけました。

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

あなたの要件を見て、同様に代替の解決策があります。コンパイル時に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の値を2進エントリ​​として格納し、その値を照会して乗数として使用することができます。このアプローチを使うと、コードを数学のものから分離し、計算を実行するためにライブラリに頼ります。

34
vine'th

テストされた最も簡単な方法は(そしてapi 1からでもうまくいく):

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

ドキュメンテーションから:

生のピクセル単位のサイズとして使用するために特定のリソースIDの次元を取得します。これはgetDimension(int)と同じですが、戻り値がサイズとして使用するために整数ピクセルに変換される点が異なります。サイズ変換では、基本値を四捨五入し、ゼロ以外の基本値のサイズが少なくとも1ピクセルになるようにします。

確かに値は丸められますが、それほど悪くはありません(hdpiとldpiデバイスの奇数値では、ldpiがあまり一般的ではない場合、少しだけ値を追加する必要があります)。本当です。

30
David