setWidth(intピクセル)はディップまたはピクセルを使用しますか?


95

setWidth(intピクセル)は、デバイスに依存しないピクセルまたは物理ピクセルを単位として使用しますか?たとえば、setWidth(100)はビューの幅を100ディップまたは100ピクセルに設定しますか?

ありがとう。

回答:


221

ピクセルを使用しますが、代わりにディップを使用する方法を疑問に思っていると思います。答えはにありTypedValue.applyDimension()ます。コードでディップをpxに変換する方法の例を次に示します。

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));

64
nbDips * getResources()。getDisplayMetrics()。densityを呼び出すこともできます
Romain Guy

9
実際、これはTypedValue.applyDimension()が行うこととまったく同じです。私はそれを投稿することを検討しましたが、何かが変更された場合に備えてAPIを通過するのが好きです...でも、問題がなければ、そのメソッドを使用しても安全だと思います。:)
Dan Lew

12
applyDimension()バージョンはより多くのコードを実行しますが、私が見つけるのは少し難しいです。FWIW、私が投稿した行は、フレームワークと標準アプリのあちこちで実際に使用しているものです。
Romain Guy

1
こんにちは。上記の2つの例を試しましたが、ピクセルが正しく計算されていないようです。代わりに、ビューで指定した正確な値を返します。私の場合はandroid:layout_width = "50dip"です。xmlファイルの正確な値を返します。次に、アプリでこれをチェックしましたが、予想通り、値が正しくなく、予想よりも大きすぎるビューを描画しました
ジョナサン

pxからptへの変換のために私が見つけた唯一の解決策は、とても素晴らしいです。
A-Live

24

コードで一定数のDIPを取得する正しい方法は、次のようにdp値を含むリソースXMLファイルを作成することです。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

次に、次のようにコードでリソースを参照します。

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

返された浮動小数点数は、デバイスのピクセル密度に応じてスケーリングされるため、アプリケーション全体で変換メソッドを複製し続ける必要はありません。


私の状況では、この解決策は、リストビューを持つカスタムダイアログがあり、ヘッダーラベルとリストビューの列の幅を同じ幅に設定したい場合に最適です。
ウェインフィップス2013年

最初の文はちょっとおかしいですが、XMLファイルを作成することが「コードで[何か]を指定する適切な方法であると基本的に言っています。まあ私はあなたがそれを指定しないコードで定数を単に使用していると思います:)
Joffrey

@ジョフリーはい私はあなたが何を意味するかを理解しているので、私は言い回しを少し更新しました
SDJMcHattie

7

メソッドsetWidth(100)、100 pxを幅として設定(dpではありません)したがって、さまざまなAndroidフォンで幅の変動の問題が発生する可能性があります。ピクセルではなくdpで測定を使用してください。サンプル幅のdpで測定するには、以下のコードを使用してください= 300px、高さ= 400px。

int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());


0

ピクセルはもちろん、メソッドはパラメーターとしてピクセルを要求しています。


1
レイアウトxmlファイル内にある場合は、android:layout_width = "100dip"またはandroid:layout_width = "100px"を指定できます。ソースコードでは、レイアウトの幅を100dipに指定できませんか?
user256239 2010年

直接ではなく、DisplayMetrics.densityを使用して変換する必要があります。
Romain Guy

0

私にうまく機能する上記の回答に基づいて、私はいくつかのヘルパーメソッドを生成します。プロジェクト全体でそれらを使用するには、それらをユーティリティに追加するだけです。

   // value in DP
   public static int getValueInDP(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInDP(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    // value in PX
    public static int getValueInPixel(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInPixel(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.