web-dev-qa-db-ja.com

Android dimension:ptとdpの違い

ドキュメントには、160 dp(密度非依存)は1インチに等しいと書かれています。また、72 ptは1インチです。だから私はなぜAndroidポイントと同じように動作するように見えるのにdp測定を定義します。誰もそれを説明できますか?

51
Herbert

Androidドキュメントは、画面密度に関係なく160 dpが常に1インチに等しいと誤って述べていました。これは bug として報告され、受け入れられ、ドキュメントが更新されました。

更新されたドキュメントから:

160 dpは常に1インチとは限りません。画面のサイズと密度によって異なります。 160dpi(mdpi)の密度の画面では、160 dpは1インチになります。

1 ptは、画面の密度に関係なく、常に1/72インチに等しくなります。

Androidこのドキュメントは こちら です。

UPDATE:

さまざまなサイズを試して確認するための小さなアプリケーションを作成しました。少なくとも私のHTC Ariaに表示されている場合、上記の内容は正しいようです。これがスクリーンショットです:

HTC Aria resource type test

これらのサイズは、Eclipseグラフィカルエディターで正確に一致しなかったことに注意してください。画面のサイズとエディターの解像度に応じて、dpとspのサイズは変動しました。エディターのスクリーンショットをいくつか示します(左は2.7インチのQVGAスライダー、右は10.1インチのWXGA、クリップ):

enter image description here

これらのエディターレンダリングが実際のデバイスと一致するかどうかを確認するのは興味深いでしょう。誰でもこれらのサイズを確認できますか?誰かが手助けしたい場合に備えて、以下に私の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)があります。改造なし.

Samsung Nexus SSamsung Galaxy Tab 10.1

Nexus Sでは、160dpは1インチよりわずかに大きくなっています。すべての通常の物理単位(in、mm、pt)はすべて同じサイズです。定規で測定しましたが、160 dpバーは本来よりも約1mm大きくなっています。物理的な単位は、本来よりも1mm短くなっています。

タブでは、すべてのバーはまったく同じで、定規で測定したものよりも1mm長くなっています。

74
John Leehey

ドキュメントには、160 dp(密度に依存しない)は1インチに等しいと書かれています。また、72 ptは1インチです。

ここでのニュアンスは、160 dp(またはdip)がroughly1インチ、72 ptexactly1インチです。違いは、Android=両方のユニットをピクセルに変換する方法です。これは、デバイスの画面密度に依存します。


単一のdpは、160 dpiのデバイス上の単一のpxです。 Androidはデバイスが該当する「密度バケット」を使用し、スケーラーを乗算してdppxに変換します。

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

dppxに変換すると、次の式に従って変換されます。dp * scaler = px


単一のptは、どの画面密度でも正確に1/72インチです。 Androidデバイスの画面の正確なdpi(xdpiおよびydpi)を使用してptpxに変換します。

ptpxに変換すると、次の式に従って変換されます。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

38
Steven Byle

好奇心から、Asus Transformer(10.1 in)とHTC Legend(3.2 in)の2つのデバイスでJohnの答えからレイアウトを試しました。結果はかなり興味深いものでした:

トランスフォーマー(トリミング):

Transformer

そして伝説:

Legend

3
howettl

ptポイント-画面の物理サイズに基づいた1/72インチ

dp密度非依存ピクセル-画面の物理的な密度に基づく抽象的な単位。これらの単位は160 dpiの画面を基準にしているため、1 dpは160 dpiの画面上の1ピクセルです。 dp-pixelの比率は画面の密度によって変化しますが、必ずしも正比例するわけではありません。注:「dp」は「sp」とより一貫性がありますが、コンパイラは「dip」と「dp」の両方を受け入れます。

3
Subayan

私は次元に苦労しましたが、私にとって意味のある見方を見つけたと思います。 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つの主要なポイントです:)

  1. 実際のデバイスのピクセル密度の範囲(例:141-199)は、変換式で同じ比率(1)になります
  2. しかし、特定のデバイスのピクセル密度が正確に160 dpiでない限り、160 dpはデバイス上で1インチにはなりません...上下に近いですが、正確にはそうではありません
3
gcbound

Ptを使用できる場合、なぜdpを使用する必要があるのですか?

開発者は、ピクセルの観点から物事を考えることに慣れています。密度に依存しないピクセルは、開発者が慣れ親しんでいるAndroidの方法です。とはいえ、必要に応じてポイント、インチ、またはミリメートルを使用することもできます。

2
CommonsWare

画面の密度に関係なく、1 dpは常に1/160インチに等しくなります。

これは、アプリケーションが示すとおりではありません...同意しますか?

BR STeN

0
STeN