ドキュメントには、160 dp(密度非依存)は1インチに等しいと書かれています。また、72 ptは1インチです。だから私はなぜAndroidポイントと同じように動作するように見えるのにdp測定を定義します。誰もそれを説明できますか?
Androidドキュメントは、画面密度に関係なく160 dpが常に1インチに等しいと誤って述べていました。これは bug として報告され、受け入れられ、ドキュメントが更新されました。
更新されたドキュメントから:
160 dpは常に1インチとは限りません。画面のサイズと密度によって異なります。 160dpi(mdpi)の密度の画面では、160 dpは1インチになります。
1 ptは、画面の密度に関係なく、常に1/72インチに等しくなります。
Androidこのドキュメントは こちら です。
UPDATE:
さまざまなサイズを試して確認するための小さなアプリケーションを作成しました。少なくとも私のHTC Ariaに表示されている場合、上記の内容は正しいようです。これがスクリーンショットです:
これらのサイズは、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>
Edit:Johnの例にさらに2つのデバイスを追加しました。左側にSamsung Nexus S(OS 2.3.3)。右側には、Samsung Galaxy Tab 10.1(OS 3.1)があります。改造なし.
Nexus Sでは、160dpは1インチよりわずかに大きくなっています。すべての通常の物理単位(in、mm、pt)はすべて同じサイズです。定規で測定しましたが、160 dpバーは本来よりも約1mm大きくなっています。物理的な単位は、本来よりも1mm短くなっています。
タブでは、すべてのバーはまったく同じで、定規で測定したものよりも1mm長くなっています。
ドキュメントには、160 dp(密度に依存しない)は1インチに等しいと書かれています。また、72 ptは1インチです。
ここでのニュアンスは、160 dp
(またはdip
)がroughly1インチ、72 pt
はexactly1インチです。違いは、Android=両方のユニットをピクセルに変換する方法です。これは、デバイスの画面密度に依存します。
単一のdp
は、160 dpiのデバイス上の単一のpx
です。 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
。
だから私はなぜAndroidポイントと同じように動作するようにdp測定を定義します。誰もそれを説明できますか?ptを使用できるのにdpを使用する必要があるのはなぜですか?
たとえば、160 dpiデバイスで160 dp
と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のディメンション単位で詳細なブログを作成しました。詳細な情報とサンプルコードが記載されています- nderstanding Density Independence in Android
好奇心から、Asus Transformer(10.1 in)とHTC Legend(3.2 in)の2つのデバイスでJohnの答えからレイアウトを試しました。結果はかなり興味深いものでした:
トランスフォーマー(トリミング):
そして伝説:
ptポイント-画面の物理サイズに基づいた1/72インチ
dp密度非依存ピクセル-画面の物理的な密度に基づく抽象的な単位。これらの単位は160 dpiの画面を基準にしているため、1 dpは160 dpiの画面上の1ピクセルです。 dp-pixelの比率は画面の密度によって変化しますが、必ずしも正比例するわけではありません。注:「dp」は「sp」とより一貫性がありますが、コンパイラは「dip」と「dp」の両方を受け入れます。
私は次元に苦労しましたが、私にとって意味のある見方を見つけたと思います。 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つの値のうちの1つしか想定できないことは私にとって重要です。
参照: 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のデバイスではインチより少し小さいになります。
これは、以前のAndroidドキュメンテーション「画面の密度に関係なく、1 dpは常に1/160inに等しくなります」の不正確さを理解するのに役立ちます。
これらは私が頭に入れようとしている2つの主要なポイントです:)
Ptを使用できる場合、なぜdpを使用する必要があるのですか?
開発者は、ピクセルの観点から物事を考えることに慣れています。密度に依存しないピクセルは、開発者が慣れ親しんでいるAndroidの方法です。とはいえ、必要に応じてポイント、インチ、またはミリメートルを使用することもできます。
画面の密度に関係なく、1 dpは常に1/160インチに等しくなります。
これは、アプリケーションが示すとおりではありません...同意しますか?
BR STeN