[Android] "px"、 "dip"、 "dp"、 "sp"の違いは何ですか?


Answers

これに関する多くのこと、サイズや密度の異なる複数の画面を最適にサポートする方法については、ここで詳しく説明しています。

画面サイズ
スクリーンの対角線として測定された実際の物理的なサイズ。 簡単にするため、Androidはすべての実際の画面サイズを4つの一般化されたサイズ(小、標準、大、超)にグループ化します。

スクリーン密度
画面の物理領域内のピクセル数。 通常はdpi(dots per inch)と呼ばれます。 例えば、「低」濃度スクリーンは、「通常」または「高」濃度スクリーンと比較して、所与の物理的エリア内のピクセル数がより少ない。 簡単にするために、Androidはすべての実際の画面密度を低、中、高、超高、超超高、超超超高の6つの一般化された密度にグループ化します。

オリエンテーション
ユーザの視点から見た画面の向き。 これは横長または縦長のいずれかです。つまり、画面のアスペクト比はそれぞれワイドまたは高さです。 異なるデバイスがデフォルトで異なる方向で動作するだけでなく、ユーザーがデバイスを回転させるときに実行時に向きが変わる可能性があることに注意してください。

解決
画面上の物理ピクセルの合計数。 複数の画面のサポートを追加する場合、アプリケーションは解像度で直接動作しません。 アプリケーションは、一般化されたサイズと密度のグループで指定されているように、画面のサイズと密度にのみ関係する必要があります。

密度非依存ピクセル(dp)
UIレイアウトを定義するときに使用する仮想ピクセル単位で、レイアウトの寸法を表現したり、密度に依存しない方法で配置することができます。 密度に依存しないピクセルは、160dpiの画面上の1つの物理ピクセルに相当します。これは、「中」の密度の画面でシステムが想定しているベースラインの密度です。 実行時に、システムは使用中の画面の実際の密度に基づいて、必要に応じてdpユニットのスケーリングを透過的に処理します。 dp単位の画面ピクセルへの変換は簡単です: px = dp * (dpi / 160) 。 例えば、240dpiのスクリーンでは、1dpは1.5物理ピクセルに等しい。 アプリケーションのUIを定義するときには、dp単位を常に使用して、異なる密度の画面にUIが正しく表示されるようにする必要があります。

複数のタイプのデバイス用にAndroidアプリを開発することについて真剣に取り組んでいる場合は、画面サポート開発ドキュメントを少なくとも1回は読んでおく必要があります。 それに加えて、特定の画面構成を持つアクティブなデバイスの実際の数を知ることは、常に良いことです。

Question

アンドロイド測定単位の違いは何ですか?

  • px
  • 浸漬
  • dp
  • sp



テキストや外観のサイズに関係するものは、 spまたはpt使用する必要があります。 一方、 dpではコントロールのサイズやレイアウトなどに関連するものを使用する必要があります。

その場所でdpdip両方を使うことができます。




The screen of a mobile phone is made up of thousands of tiny dots known as pixels (px) . A pixel is the smallest element which goes to make the picture. The more the number of pixels to make a picture or wording, the sharper it becomes and makes the smartphone screen more easily readable.

Screen resolution is measured in terms of number of pixels on the screen. Screen resolution is a commonly-used specification when buying a device, but it's actually not that useful when designing for Android because thinking of screens in terms of pixels ignores the notion of physical size, which for a touch device is really really important.

Density independent pixel (dp or dip) allow the designer to create assets that appear in a expected way, no matter the resolution or density of target device.

A density independent pixel (dp or dip) is equal to one pixel at the baseline density or 160 dpi (dots per inch).

1 px/1dp = 160 dpi/160 dpi

2 px/1dp = 320 dpi(2x)/160 dpi

ここで、

dpi is dots per inch

So, at 320 dpi, 1 dp is equal to 2 px.

px/dp = dpi/160dpi

Dots per inch (dpi) is a measure of the sharpness (that is, the density of illuminated points) on a display screen. The dots per inch for a given picture resolution will differ based on the overall screen size since the same number of pixels are being spread out over a different space.

Working with density independent pixels help us to deal with a situation like where you have two devices with same pixel resolution, but differing amount of space. Suppose in a case, a tablet and phone has the same pixel resolution 1280 by 800 pixels (160 dpi) and 800 by 1280 pixels (320 dpi) respectively.

Now because a tablet is at baseline density (160 dpi) its physical and density independent pixels sizes are the same, 1280 by 800. The phone on the other hand has a higher pixel density, so it has half as many density independent pixels as physical pixels. So a phone has 400 by 640 density independent pixels. So using a density-independent pixel makes it easier to mentally picture that tablet has much more space than the phone.

Similarly, if you have two devices with similar screen size, but different pixel density, say one is 800 by 1280 pixels (320 dpi), and the other is 400 by 640 pixels (160 dpi), we don't need to define totally different layouts for these two devices as we can measure assets in terms of density independent pixel which is same for both devices.

800 by 1280 pixels (320dpi)=400 by 640 density independent pixel (dp)

400 by 640 pixels (160 dpi)=400 by 640 density independent pixel (dp)

Scale independent pixels(sp) is the preferred unit for font size. For accessibility purposes, Android allows users to customize their device's font size. Users that have trouble reading text can increase their device's font size. You can normally find this option in the display setting on your phone or tablet under font size. It's often also available through the accessibility settings.

With scale independent pixels, 16 sp is exactly the same as 16 dp when the device's font size is normal or 100%. But when device's font size is large, for example 125%, 16 sp will translate to 20 dp or 1.25 times 16.

If you use dp as the unit for font size, then that piece of text has a specific physical size no matter if the user has customize device's font size. Using sp units will make a better experience for people with impaired eyesight.

Reference : Udacity , Google




基本的にpxが適用される唯一の時間は1pxです。これは、分割線の場合のように画面上に正確に1つのピクセルが必要な場合です。

160 dpi以上では、2〜3ピクセル、

120 dpi以上では、0に丸められます。




SDP - a scalable size unit - basically it is not a unit, but dimension resources for different screen size.

Try the sdp library from Intuit. It's very handy to solve unit problems, and you can quickly support multiple screens .

使用法

android:paddingBottom="@dimen/_15sdp" for positive and android:layout_marginTop="@dimen/_minus10sdp" for negative sdp sdp

It has equivalent value in dp for each size in values-sw<N>dp folders (sw = smallestWidth).

Attention

Use it carefully! In most cases you still need to design a different layout for tablets.

<LinearLayout
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginTop="@dimen/_minus10sdp"
          android:paddingBottom="@dimen/_15sdp"
          android:orientation="horizontal" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:includeFontPadding="false"
                    android:text="♡"
                    android:textColor="#ED6C27"
                    android:textSize="@dimen/_70sdp"
                    android:textStyle="bold" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:includeFontPadding="false"
                    android:text="U"
                    android:textColor="@android:color/black"
                    android:textSize="@dimen/_70sdp" />
            </LinearLayout>

You can use db for text size, but I prefer ssp for text size.

For more details, check the library GitHub page .




定義

pxまたはdotは物理スクリーン上のピクセルです。

dpiは、物理スクリーン上の1インチあたりのピクセルであり、ディスプレイの密度を表します。

Androidはいくつかの密度に別名を与える

  • ldpi(低)〜120dpi
  • mdpi(中)〜160dpi
  • hdpi(高)〜240dpi
    • 2015年のほとんどの端末がここにあります
  • xhdpi(超高)〜320dpi
    • Apple iPhone 4/5/6、Nexus 4
  • xxhdpi(余分な超高)〜480dpi
    • ネクサス5
  • xxxhdpi(超特別高)〜640dpi

ディップまたはdpは、 濃度非依存ピクセルであり 、すなわち、それらは、物理的密度に応じて多かれ少なかれピクセルに対応する。

  • 1dp = 1px on mdpi

spまたはsipスケールに依存しないピクセルです。 [設定] > [ アクセシビリティ ]で [ 大文字 ]オプションをオンにすると、

  • 1sp = 1dp
  • アクセス可能な1sp = 1.2dp大文字

何を使用するのですか?

テキストサイズにはspを使用します。

それ以外はすべてdpを使います。




Before answering this question let me decrease the number of units first. So here you go: dp or dip are both the same and are known as Density-independent pixels .

1. px - stands for pixels. Pixels are a single dot, point on a screen. Generally in the mobile industry it is measured in ppi (pixels per inch). Screen resolution is directly proportional to ppi, the larger the number of pixels per inch the higher the screen resolution.

For example, if you draw an image of a size 200 px * 200 px , then its appearance must be different on a high-resolution device versus a low-resolution device. The reason is a 200 px image on a low-resolution phone will be look larger than on a high-resolution device.

Below images are showing a resolution of the same image on different phones -

  • Phone with High screen resolution

  • Phone with Low screen resolution

2. dip or dp - an abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi screen, so one dp is one pixel on a 160 dpi screen. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. "Density independence" refers to the uniform display of UI elements on screens with different densities.

  • Image which is showing 80px (left side image) and 80 dp (right-side image) . Checkout difference.

A dp is equal to one physical pixel on a screen with a density of 160 . To calculate dp:

dp = (width in pixels * 160) / screen density

3. sp - stands for scalable pixels. Generally sp is used for texts on the UI, and sp preserves the font settings. For example, if a user selected a larger font than 30 sp it will auto scale to appear large according to a user preference.




Settings->Accessibility->Large Textオプションを変更することで、公式ドキュメントからコピーされた回答による「 ユーザのフォントサイズ設定 」と言われるdp単位とsp単位の違いを表示することができます。

Large Textオプションは、テキストを1.3倍大きくします。

private static final float LARGE_FONT_SCALE = 1.3f;

これはpackages/apps/Settingsので、もちろんベンダーに依存する可能性がありpackages/apps/Settings




dpi -

  • 1インチあたりのドット数
  • 画面のピクセル密度を測定します。

px - ピクセル

  • 画面ピクセルのマッピング

ポイント - ポイント

  • 物理的な画面サイズに関して、約1/72インチ。

物理的な画面サイズ(1インチ= 2.54 cm)に対して、インチ単位で表示されます。

ミリメートル - 物理的なスクリーンサイズに関して。

sp - スケール独立ピクセル。

  • ユーザーのフォントサイズ設定に基づいています。
  • フォントは 'sp'にする必要があります。

ディップ -

  • ディップ== dp
  • 密度に依存しないピクセル。
  • 画面密度に応じて異なります。
  • 160dpiの画面では、1dp = 1ピクセル。
  • テキストのフォントサイズ以外はdpを使用してください。

標準では、dpとspが使用されます。 フォントサイズはsp、それ以外はdpです。

ユニットの変換式:

px = dp *(dpi / 160)。

Density Bucket -> Screen Display => Physical Size        => Pixel Size                   

ldpi         -> 120 dpi          => 0.5 x 0.5 in         => 0.5 in * 120 dpi = 60x60 px   

mdpi         -> 160 dpi          => 0.5 x 0.5 in         => 0.5 in * 160 dpi = 80x80 px   

hdpi         -> 240 dpi          => 0.5 x 0.5 in         => 0.5 in * 240 dpi = 120x120 px  

xhdpi        -> 320 dpi          => 0.5 x 0.5 in         => 0.5 in * 320 dpi = 160x160 px  

xxhdpi       -> 480 dpi          => 0.5 x 0.5 in         => 0.5 in * 480 dpi = 240x240 px 

xxxhdpi      -> 640 dpi          => 0.5 x 0.5 in         => 0.5 in * 640 dpi = 320x320 px  



Screen size in Android is grouped into categories ldpi , mdpi , hdpi , xhdpi , xxhdpi and xxxhdpi . Screen density is the amount of pixels within an area (like inch) of the screen. Generally it is measured in dots-per-inch ( dpi ).

PX(Pixels):

  • our usual standard pixel which maps to the screen pixel. px is meant for absolute pixels. This is used if you want to give in terms of absolute pixels for width or height. Not recommended.

DP/DIP(Density pixels / Density independent pixels):

  • dip == dp . In earlier Android versions dip was used and later changed to dp . This is alternative of px .

  • Generally we never use px because it is absolute value. If you use px to set width or height, and if that application is being downloaded into different screen sized devices, then that view will not stretch as per the screen original size.

  • dp is highly recommended to use in place of px . Use dp if you want to mention width and height to grow & shrink dynamically based on screen sizes.

  • if we give dp/dip , android will automatically calculate the pixel size on the basis of 160 pixel sized screen.

SP(Scale independent pixels):

  • scaled based on user's font size preference. Fonts should use sp .

  • when mentioning the font sizes to fit for various screen sizes, use sp . This is similar to dp .Use sp especially for font sizes to grow & shrink dynamically based on screen sizes

Android Documentation says:

when specifying dimensions, always use either dp or sp units. A dp is a density-independent pixel that corresponds to the physical size of a pixel at 160 dpi . An sp is the same base unit, but is scaled by the user's preferred text size (it's a scale-independent pixel), so you should use this measurement unit when defining text size




どこから&pxとdpの関係を使うのか?

密度非依存ピクセル(dp)

UIレイアウトを定義するときに使用する仮想ピクセル単位で、レイアウトの寸法を表現したり、密度に依存しない方法で配置することができます。 上述したように、濃度非依存ピクセルは、160dpiスクリーン上の1つの物理ピクセルに相当し、これは、「中」の濃度スクリーンについてシステムによって想定されるベースライン濃度である。 実行時に、システムは使用中の画面の実際の密度に基づいて、必要に応じてdpユニットのスケーリングを透過的に処理します。 dp単位の画面ピクセルへの変換は簡単です:

px = dp *(dpi / 160)。

例えば、240dpiのスクリーンでは、1dpは1.5物理ピクセルに等しい。 アプリケーションのUIを定義するときには、dp単位を常に使用して、異なる密度の画面にUIが正しく表示されるようにする必要があります。

ピクセルをdpに、またはその逆を理解することは非常に重要です(特に、クリエイティブチームに正確なdp値を与えるため)

dp = px * 160 / dpi

MDPI = 160 dpi || Therefore, on MDPI 1 px = 1 dp
For example, if you want to convert 20 pixel to dp, use the above formula,
dp = 20 * 160 / 160 = 20.
So, 20 pixel = 20 dp.

HDPI = 240 dpi - So, on HDPI 1.5 px = 1 dp
XHDPI = 320 dpi - So, on XHDPI 2 px = 1 dp
XXHDPI = 480 dpi - So, on XXHDPI 3 px = 1 dp

For example, let us consider Nexus 4.
If 24 pixels to be converted to dp and if it is a Nexus 4 screen, developers can
convert it to dp easily by the following calculation :
dp = 24 * 160 / 320 = 12 dp
Screen dimension:
768 x 1280 pixel resolution (320 ppi or 320dpi)
Optional (screen size):
 4.7" diagonal
  • クリエイティブチームから偶数のピクセル値をすべて取得してみてください。 さもなければ、0.5を掛けている間に精度が失われます。

px

これは上で説明した通りです。 レイアウトファイルを使わないでください。 しかし、pxが必要な場合もあります。 たとえば、ListViewディバイダ行です。 画面解像度を越えたすべての分割線として1ピクセルラインを与えるためには、pxが優れています。

sp

フォントサイズにはspを使用します。 次に、デバイスフォントのサイズが変更されている間に、アプリケーション内のフォントだけが変更されます(つまり、表示 - >フォントがデバイスに表示されます)。 静的なサイズのフォントをアプリケーション内に保持したい場合は、dpでフォントのサイズを指定できます。 このような場合、決して変更されません。 開発者は、spの代わりにdpを使用することができるように、いくつかの特定の画面についてそのような要件を得ることができます。 それ以外の場合は、spを推奨します。




dpdipです。 すべてに使用します(マージン、パディングなど)。

{text-size}にのみspを使用してください。

さまざまな画面の密度で同じサイズを得るために、Androidは実行時にこれらの単位をピクセルに変換するので、あなたにとっては厄介な数学はありません。

さまざまな画面サイズでpxdpspの違いを見てください。

出典: Androidプログラミング:Big Nerd Ranch Guide




sp = scale independent pixel

dp = density independent pixels

dpi = density pixels

I have gone through the above answers...not finding them exactly correct. sp for text size, dp for layout bounds - standard. But sp for text size will break the layout if used carelessly in most of the devices.

sp take the textsize of the device, whereas dp take that of device density standard( never change in a device) Say 100sp text can occupies 80% of screen or 100% of screen depending on the font size set in device

You can use sp for layout bounds also, it will work :) No standard app use sp for whole text

Use sp and dp for text size considering UX.

  • Dont use sp for text in toolbar( can use android dimens available or dp)
  • Dont use sp for text in small bounded buttons, very smaller text, etc

Some people use huge FONT in their phone for more readability, giving them small hardcoded sized text will be an UX issue. Put sp for text where necessary, but make sure it won't break the layout.




pxピクセル - スケール単位のポイントは、画面上の実際のピクセルに対応します。

スクリーンの物理的なサイズに基づいてインチで表示されます。

mmミリメートル - 画面の物理的なサイズに基づいています。

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

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

sp - スケールに依存しないピクセル - これはdp単位と似ていますが、ユーザーのフォントサイズの優先順位によってもスケールされます。 フォントサイズを指定するときは、本機を使用することをお勧めします。そのため、画面の密度とユーザーの好みの両方で調整されます。

同じサイズの2つのスクリーンの例を考えてみましょう.1つは画面密度が160 dpi(1インチあたりのドット数、つまり1インチあたりのピクセル数)で、もう1つは240 dpiです。

                          Lower resolution   screen          Higher resolution, same size
Physical Width                      1.5 inches                        1.5 inches
Dots Per Inch (“dpi”)               160                               240
Pixels (=width*dpi)                 240                               360
Density (factor of baseline 160)    1.0                               1.5

Density-independent Pixels          240                               240
(“dip” or “dp” or “dps”)

Scale-independent pixels 
 (“sip” or “sp”)                  Depends on user font size settings    same



Androidで使用される数式は次のとおりです。

px = dp *(dpi / 160)

ここで、dpiは以下の画面密度のいずれかです。 すべての可能な密度の一覧はこちらへ

それは "DENSITY_ *"定数を定義します。

  • ldpi(低)〜120dpi
  • mdpi(中)〜160dpi
  • hdpi(高)〜240dpi
  • xhdpi(超高)〜320dpi
  • xxhdpi(余分な超高)〜480dpi
  • xxxhdpi(超特別高)〜640dpi

ここから撮影。

これは、画面のdpiを知っていれば、pxとdpの間で翻訳を行う際に混乱をたくさん取り除きます。

だから、あなたは60 dpの物理的なピクセルサイズは、hdpi画面の60 dpの画像をしたいとしましょう:

px = 60 * (240 / 160)



Links