ドキュメントによると、160 dp (密度に依存しない) は 1 インチに相当します。また、72 pt も 1 インチです。したがって、ポイントと同じように機能するように見えるのに、なぜアンドロイドが dp 測定を定義するのかわかりません。誰もそれを説明できますか?pt を使用できるのに、なぜ dp を使用する必要があるのですか?
7 に答える
Androidのドキュメントでは、画面の密度に関係なく、160dpは常に1インチに等しいと誤って記載されていました。これは、受け入れられ、ドキュメントが更新されたバグとして報告されました。
更新されたドキュメントから:
160 dpは常に1インチに等しいとは限りません。画面のサイズや密度によって、異なります。密度が160dpi(mdpi)の画面では、160dpは1インチに相当します。
画面密度に関係なく、1ポイントは常に1/72インチに等しくなります。
これに関するAndroidのドキュメントはこちらです。
アップデート:
さまざまなサイズを確認するために、小さなアプリケーションを作成しました。少なくとも私のHTCAriaに表示されている場合は、上記の内容が正しいように見えます。これがスクリーンショットです:
これらのサイズがEclipseグラフィカルエディタで正確に一致しなかったことに注意するのは興味深いことです。画面のサイズとエディターの解像度に応じて、dpとspのサイズが変動しました。これがエディターからのスクリーンショットです(左は2.7インチQVGAスライダー、右は10.1インチWXGA、クリップ):
これらのエディターのレンダリングが実際のデバイスと一致するかどうかを確認するのは興味深いことです。誰かがこれらのサイズを確認できますか?誰かが助けたいと思った場合に備えて、以下に私のxmlを添付します。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical">
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="160dp"></TextView>
<View android:id="@+id/view1" android:layout_height="20dip" android:layout_width="160dp" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View>
<TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="72pt"></TextView>
<View android:id="@+id/view2" android:layout_height="20dip" android:layout_width="72pt" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View>
<TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="1in"></TextView>
<View android:id="@+id/View01" android:layout_height="20dip" android:layout_width="1in" android:layout_marginLeft="20sp" android:background="#FF22FF22"></View>
<TextView android:layout_width="wrap_content" android:textSize="22sp" android:layout_height="wrap_content" android:text="160sp" android:padding="5sp" android:id="@+id/TextView01"></TextView>
<View android:layout_marginLeft="20sp" android:layout_width="160sp" android:id="@+id/View04" android:background="#FF22FF22" android:layout_height="20dip"></View>
<TextView android:layout_width="wrap_content" android:textSize="22sp" android:layout_height="wrap_content" android:padding="5sp" android:id="@+id/TextView02" android:text="160px"></TextView>
<View android:layout_marginLeft="20sp" android:id="@+id/View03" android:background="#FF22FF22" android:layout_height="20dip" android:layout_width="160px"></View>
<TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="22sp" android:padding="5sp" android:text="25.4mm"></TextView>
<View android:id="@+id/View02" android:layout_height="20dip" android:layout_marginLeft="20sp" android:background="#FF22FF22" android:layout_width="25.4mm"></View>
</LinearLayout>
編集:ジョンの例にさらに2つのデバイスを追加しました。左側はSamsungNexusS(OS 2.3.3)です。右側は、Samsung Galaxy Tab 10.1(OS 3.1)です。改造はありません。
Nexus Sでは、160dpは1インチより少し大きいです。すべての通常の物理単位(in、mm、pt)はすべて同じサイズです。定規で測定したところ、160dpのバーが本来より約1mm大きくなっています。物理的な単位は本来より1mm短くなっていますが。
タブでは、すべてのバーがまったく同じで、定規で測定したものより1mm長くなっています。
ドキュメントによると、160 dp (密度に依存しない) は 1 インチに相当します。また、72 pt も 1 インチです。
ここでのニュアンスは、160 dp
(またはdip
) が約1 インチであるのに対し、72pt
は正確に1 インチであるということです。違いは、Android が両方の単位をピクセルに変換する方法です。これは、デバイスの画面密度によって異なります。
シングルdp
は、px
160 dpi のデバイスでのシングルです。Android は、デバイスが該当する「密度バケット」を使用し、スケーラーを掛けて に変換dp
しpx
ます。
Bucket | DPI | Scaler
---------------------
ldpi | 120 | 0.75
mdpi | 160 | 1.00
tvdpi | 213 | 1.33
hdpi | 240 | 1.50
xhdpi | 320 | 2.00
xxhdpi | 480 | 3.00
dp
次の式に従ってpx
変換します: dp * scaler = px
.
シングルpt
は、どの画面密度でも正確に 1/72 インチです。Androidは、デバイスの画面の正確な dpi (xdpi および ydpi) を使用するように変換pt
します。px
pt
次の式に従ってpx
変換します: pt / 72 * dpi = px
.
したがって、ポイントと同じように機能するように見えるのに、なぜアンドロイドが dp 測定を定義するのかわかりません。誰もそれを説明できますか?pt を使用できるのに、なぜ dp を使用する必要があるのですか?
例として、160 dpi デバイスで160dp
と 72を表示します。pt
160 dpi のデバイスは、スケーラーが 1.0 の mdpi 密度バケットに分類されます。上記の式を使用して に変換しpx
ます。
160 dp * 1.0 = 160 px
72 pt / 72 * 160 = 160 px
170 dpi のデバイスではどうでしょうか。170 dpi のデバイスは、スケーラーが 1.0 の mdpi 密度バケットに分類されます。
160 dp * 1.0 = 160 px
72 pt / 72 * 170 = 170 px
150 dpi のデバイスではどうでしょうか。150 dpi のデバイスは、スケーラーが 1.0 の mdpi 密度バケットに分類されます。
160 dp * 1.0 = 160 px
72 pt / 72 * 150 = 150 px
話の教訓は、dp
正確な寸法を維持し、パフォーマンスを維持するのに役立ち、デバイスの密度に応じて物理的なサイズの変動を許容することです。一方、pt
はすべての密度でまったく同じ物理サイズであるため、使用される量が異なりpx
、画像で使用するとパフォーマンスが低下し、エイリアシングやアーティファクトが発生する可能性があります。dp
絶対に正確な物理的寸法が必要でない限り (画面上に定規がある場合など)、 をお勧めします。
私は、Android の次元単位に関する詳細なブログを書きました。このブログでは、より多くの情報とサンプル コードを提供しています - Android における密度の非依存性を理解する
好奇心から、Asus Transformer (10.1 インチ) と HTC Legend (3.2 インチ) の 2 つのデバイスで John の回答のレイアウトを試してみました。結果は非常に興味深いものでした:
変圧器 (トリミング):
そして伝説:
私は寸法に苦労しましたが、私にとって意味のある見方を見つけたと思います. Wei-Meng Lee の「Beginning Android 4 Application Development」(pg 111) に変換式があります。
実際のピクセル = dp * ( dpi / 160 )、dpi は 120、160、240、または 320 のいずれかです
したがって、その式を使用して、携帯電話/エミュレーターのどの dpi がこれらの 4 つの値のいずれかに最も近いかを見つけることができ、変換する式で使用される比率 (3/4、1、3/2、または 2) が決まります。 dpからピクセルへ. 実際のデバイスのピクセル密度に関係なく、式の dpi はこれら 4 つの値のいずれかのみを想定できることが重要です。
http://en.wikipedia.org/wiki/List_of_displays_by_pixel_densityを参照すると、ピクセル密度が 235 dpi の Nexus S の場合、変換は次のようになります。
ピクセル = dp * 3/2
たとえば、160dp のボタンは 240px になります (デバイスの 235 dpi では 1 インチより少し広い)。
HTC Legend の場合、ピクセル密度が 181 dpi の式は次のとおりです。
ピクセル = dp * 1
(181 が 160 に最も近いため)。そのため、160dp ボタンは 160ピクセルになり、ピクセル密度が 181dpi のデバイスでは1 インチよりわずかに小さくなります。
これは、以前の Android ドキュメントの「画面密度に関係なく、1 dp は常に 1/160 インチに等しい」という誤りを理解するのに役立ちます。
これらは、私が頭に入れようとしている2つの主要なポイントです:)
- 実際のデバイスのピクセル密度の範囲 (例: 141-199) は、変換式で同じ比率 (1) になります。
- ただし、特定のデバイスのピクセル密度が正確に 160 dpi でない限り、160 dp はデバイス上で 1 インチにはなりません...上下に近いですが、正確ではありません
pt ポイント - 画面の物理的なサイズに基づく 1/72 インチ。
dp 密度に依存しないピクセル - 画面の物理密度に基づく抽象的な単位。これらの単位は 160 dpi スクリーンを基準にしたものであるため、1 dp は 160 dpi スクリーン上の 1 ピクセルです。dp とピクセルの比率は画面密度によって変化しますが、必ずしも正比例するとは限りません。注: コンパイラは "dip" と "dp" の両方を受け入れますが、"dp" は "sp" とより一貫性があります。
pt を使用できるのに、なぜ dp を使用する必要があるのですか?
開発者は、ピクセルの観点から物事を考えることに慣れています。密度に依存しないピクセルは、開発者が慣れ親しんだものに近づけるための Android の方法でした。そうは言っても、必要に応じて、ポイント、インチ、またはミリメートルを使用できます。
画面密度に関係なく、1dpは常に1/160インチに等しくなります。
これは、アプリケーションで示されているように正しくありません...同意しますか?
BR STeN