android px換算 - “px”,“dip”,“dp”和“sp”之間有什麼區別?




android中的dp dp單位 (25)

android測量單位有什麼區別?

  • PX
  • DP
  • SP

Answers

Android 屏幕尺寸分為smallmediumlargeextra largedouble-extratriple-extra 。屏幕密度是屏幕區域(如英寸)內的像素數量。通常,它以每英寸點數(dpi)來測量。屏幕密度分為低,中,高和超高。分辨率是屏幕中的總像素數。

  • dp:密度獨立像素,它根據屏幕密度而變化。在160 dpi屏幕中,1 dp = 1像素。除字體大小外,請始終使用dp。
  • dip: dip == dp。在早期的Android版本中,使用了dip,後來改為dp。
  • sp: Scale Independent Pixel,根據用戶的字體大小首選項進行縮放。字體應該使用sp。
  • px:我們通常的標準像素,映射到屏幕像素。
  • in:英寸,相對於物理屏幕尺寸。
  • 毫米:毫米,相對於物理屏幕尺寸。
  • pt: 1/72英寸,相對於物理屏幕尺寸。

單位之間轉換公式

 px = dp * (dpi / 160)

dp到設備中的px

以下示例有助於更好地理解。基於桶大小120(ldpi),160(mdpi),240(hdpi),320(xhdpi),480(xxhdpi)和640(xxxhdpi)進行縮放。對於ldpi,谷歌建議的設計比例為3:4:6:8:12:mdpi:hdpi:xhdpi:xxhdpi

150px X 150px圖像將佔用,

  • mdpi中150 dp X 150 dp的屏幕空間
  • hdpi中的100 dp X 100 dp屏幕空間
  • xhdpi中的75 dp X 75 dp屏幕空間

當您希望在所有Android設備中使用統一的UI設計時,可以使用以下DPI計算器來修復圖像大小和其他尺寸。

Java中的DPI計算器

/*
Program output
LDPI: 165.0 X 60.0
MDPI: 220.0 X 80.0
HDPI: 330.0 X 120.0
XHDPI: 440.0 X 160.0
XXHDPI: 660.0 X 240.0
XXXHDPI: 880.0 X 320.0
*/


public class DPICalculator {

private final float LDPI = 120;
private final float MDPI = 160;
private final float HDPI = 240;
private final float XHDPI = 320;
private final float XXHDPI = 480;
private final float XXXHDPI = 640;    

private float forDeviceDensity;
private float width;
private float height;

public DPICalculator(float forDeviceDensity, float width, float height){
    this.forDeviceDensity = forDeviceDensity;
    this.width = width;
    this.height = height;
}

public static void main(String... args) {
    DPICalculator dpiCalculator = new DPICalculator(240,330,120);
    dpiCalculator.calculateDPI();
}


private float getPx(float dp, float value) {
    float px = dp * (value / forDeviceDensity );        
    return px;
}

private void calculateDPI() {

    float ldpiW = getPx(LDPI,width);        
    float ldpiH =  getPx(LDPI,height);
    float mdpiW = getPx(MDPI,width);        
    float mdpiH =  getPx(MDPI,height);        
    float hdpiW = getPx(HDPI,width);        
    float hdpiH =  getPx(HDPI,height);       
    float xdpiW = getPx(XHDPI,width);        
    float xdpiH =  getPx(XHDPI,height);
    float xxdpiW = getPx(XXHDPI,width);        
    float xxdpiH =  getPx(XXHDPI,height);
    float xxxdpiW = getPx(XXXHDPI,width);        
    float xxxdpiH =  getPx(XXXHDPI,height);

    System.out.println("LDPI: " + ldpiW + " X " + ldpiH);
    System.out.println("MDPI: " + mdpiW + " X " + mdpiH);
    System.out.println("HDPI: " + hdpiW + " X " + hdpiH);
    System.out.println("XHDPI: " + xdpiW + " X " + xdpiH);
    System.out.println("XXHDPI: " + xxdpiW + " X " + xxdpiH);
    System.out.println("XXXHDPI: " + xxxdpiW + " X " + xxxdpiH);        
   }
}

更多信息請參考以下鏈接。

http://javapapers.com/android/difference-between-dp-dip-sp-px-in-mm-pt-in-android/


定義

px或dot是物理屏幕上的一個像素

dpi是物理屏幕上每英寸的像素數,表示顯示器的密度。

Android為幾種密度提供別名

  • ldpi(低)~120dpi
  • mdpi(中)~160dpi
  • hdpi(高)~240dpi
    • 2015年的大多數設備都在這裡
  • xhdpi(超高)~320dpi
    • Apple iPhone 4/5/6,Nexus 4
  • xxhdpi(extra-extra-high)~480dpi
    • Nexus 5
  • xxxhdpi(額外超高)~640dpi

dipdp密度依賴的像素 ,即它們根據物理密度對應於更多或更少的像素。

  • mdpi上1dp = 1px

spsip是一個與比例無關的像素 。 在“設置” >“ 輔助功能”中打開“ 大文本”選項時,它們會縮放

  • 1sp = 1dp
  • 1sp = 1.2dp,可訪問性大文本

用什麼?

使用sp表示文本大小。

dp用於其他一切。


來源1

來源2

來源3 :( 來源3的數據如下)

這些是以XML定義的維度值。 使用數字後跟度量單位指定維度。 例如:10px,2in,5sp。 Android支持以下度量單位:

DP

密度無關像素 - 基於屏幕物理密度的抽象單位。 這些單位相對於160 dpi(每英寸點數)的屏幕,其中1dp大致等於1px。 在更高密度的屏幕上運行時,用於繪製1dp的像素數按照適合屏幕dpi的係數放大。 同樣,當在較低密度屏幕上時,用於1dp的像素數按比例縮小。 dp與像素的比率將隨著屏幕密度而變化,但不一定是成正比的。 使用dp單位(而不是px單位)是一種簡單的解決方案,可以使佈局中的視圖尺寸適當調整以適應不同的屏幕密度。 換句話說,它為不同設備的UI元素的實際大小提供了一致性。

SP

與比例無關的像素 - 這與dp單位類似,但它也可以根據用戶的字體大小首選項進行縮放。 建議您在指定字體大小時使用此單位,以便根據屏幕密度和用戶偏好調整它們。

PT

點數 - 基於屏幕物理尺寸的1/72英寸。

PX

像素 - 對應屏幕上的實際像素。 建議不要使用此計量單位,因為實際表示可能因設備而異; 每個設備可以具有每英寸不同數量的像素,並且可以在屏幕上具有更多或更少的總像素。

毫米

毫米 - 基於屏幕的物理尺寸。

英寸 - 基於屏幕的物理尺寸。

注意:維度是使用name屬性中提供的值(而不是XML文件的名稱)引用的簡單資源。 因此,您可以將維度資源與一個XML文件中的其他簡單資源組合在一個元素下。


您可以從下圖中看到pxdp之間的差異,您還可以發現pxdp無法保證不同屏幕上的物理尺寸相同。


  • px - 一個像素,與CSS,JavaScript等中使用的像素相同。
  • sp - scale-independent像素
  • 傾角 - 密度無關的像素

通常sp用於字體大小,而dip用於其他人(也稱為dp)。


我想提供一種簡單易懂的方法dp。事實上,我認為這dp是最容易理解的。dp只是一個物理長度單位。它和mmor的尺寸相同inch。這對我們來說只是方便50dp60dp而不是50/160 inch或者60/160 inch,因為一個dp1/160 inch屏幕大小或分辨率。

唯一的問題是,某些屏幕的android dpi不准確。例如,分類為160dpi的屏幕確實可以具有170dpi。因此計算結果dp是模糊的。它應該大致相同1/160 inch


sp =與尺度無關的像素

dp = dip =密度獨立像素

dpi =每英寸點數

我們應該避免使用sp

我們應該使用dp來支持多個屏幕。

Android支持不同的屏幕分辨率

  • ldpi(低)~120 dpi
  • mdpi(中)~160 dpi
  • hdpi(高)~240 dpi
  • xhdpi(超高)~320 dpi
  • xxhdpi(超高 - 超)~480 dpi
  • xxxhdpi(超額外超高)~640 dpi

120 dp ldpi設備具有1英寸大小的120像素。

其他密度相同......

我們作為軟件工程師應該使用這個轉換公式:

pixel = dp *(密度/ 160)

因此,240 dpi設備的1 dp將具有= 1 *(240/160)= 3/2 = 1.5像素。

而480 dpi設備的1 dp將具有= 1 *(480/160)= 3像素。

利用1.5和3像素的知識,軟件工程師可以設計不同密度的佈局。

要檢查任何設備的屏幕參數:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

Toast.makeText(
    this,
    "4:" + metrics.heightPixels + "," + metrics.density + ","
    + metrics.densityDpi, Toast.LENGTH_LONG).show();

此外,您應該清楚地了解以下概念:

屏幕尺寸:

實際物理尺寸,以屏幕對角線測量。 為簡單起見,Android將所有實際屏幕尺寸分為四種通用尺寸:小尺寸,普通尺寸,大尺寸和超大尺寸。

屏幕密度:

屏幕物理區域內的像素數量; 通常稱為dpi(每英寸點數)。 例如,與“正常”或“高”密度屏幕相比,“低”密度屏幕在給定物理區域內具有更少的像素。 為簡單起見,Android將所有實際屏幕密度分為四種通用密度:低,中,高和超高。

取向:

從用戶的角度看屏幕的方向。 這可以是橫向或縱向,這意味著屏幕的寬高比分別為寬或高。 請注意,默認情況下,不僅不同的設備在不同的方向上運行,但是當用戶旋轉設備時,方向可以在運行時更改。

解析度:

屏幕上的物理像素總數。 添加對多個屏幕的支持時,應用程序無法直接使用分辨率; 應用程序應僅關注屏幕尺寸和密度,如通用尺寸和密度組所指定。

密度無關像素(dp):

在定義UI佈局時應使用的虛擬像素單元,以與密度無關的方式表達佈局尺寸或位置。 與密度無關的像素相當於160 dpi屏幕上的一個物理像素,這是系統為“中等”密度屏幕假定的基線密度。 在運行時,系統根據使用的屏幕的實際密度,根據需要透明地處理dp單元的任何縮放。 dp單位到屏幕像素的轉換很簡單:px = dp *(dpi / 160)。 例如,在240 dpi屏幕上,1 dp等於1.5個物理像素。 在定義應用程序的UI時,應始終使用dp單位,以確保在具有不同密度的屏幕上正確顯示UI。

參考: Android開發者網站


在哪裡使用px和dp之間的關係和關係?

密度無關像素(dp)

在定義UI佈局時應使用的虛擬像素單元,以與密度無關的方式表達佈局尺寸或位置。 如上所述,與密度無關的像素相當於160dpi屏幕上的一個物理像素,這是系統為“中”密度屏幕假定的基線密度。 在運行時,系統根據使用的屏幕的實際密度,根據需要透明地處理dp單元的任何縮放。 將dp單位轉換為屏幕像素很簡單:

px = dp *(dpi / 160)。

例如,在240 dpi屏幕上,1 dp等於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分隔線。 對於所有跨屏幕分辨率,px更適合為一個像素線作為分頻器。

SP

使用sp表示字體大小。 然後,只有設備字體大小發生變化時,應用程序內部的字體才會發生變化(即顯示 - >設備上的字體)。 如果要在應用程序中保留靜態大小的字體,可以在dp中指定字體尺寸。 在這種情況下,它永遠不會改變。 開發人員可能會對某些特定屏幕有這樣的要求,因此,開發人員可以使用dp而不是sp。 在所有其他情況下,建議使用sp。


1) dp: (density independent pixels)

以dp為單位表示的像素數將隨著屏幕分辨率的增加而增加(當你有更多的點/像素/英寸時)。相反,在具有較低分辨率的設備上,以dp為單位表示的像素數將減少。由於這是一個相對單位,因此需要有一個基線進行比較。此基線是160 dpi屏幕。這是等式:px = dp * (dpi / 160).


2) sp: (scale independent pixels)

此單位根據屏幕dpi(類似於dp)以及用戶的字體大小首選項進行縮放。


3) px: (pixels)

屏幕上的實際像素或點。


有關詳細信息,請訪問

Android開發人員指南> Dimension
Android開發人員指南>屏幕


我只會使用dp。

關於使用“sp”進行字體大小的討論很多,雖然我很欣賞這一點,但從設計的角度來看,我認為這不是正確的做法。 如果用戶選擇了一些不穩定的字體,您最終可能會破壞您的設計,並且用戶最終會指責應用程序 ,而不是他們自己的生活選擇。

此外,如果您在160 dpi平板電腦上使用sp-font應用程序,您會發現所有內容都會擴展...但是您的字體相比之下看起來很小。 這不好看。

雖然“sp”字體的想法有一顆好心,但這是一個糟糕的主意。 堅持使用dp。


我發現了一篇關於為不同的屏幕分辨率設計Android應用程序UI的好文章,我想留在這裡只是為了在這個領域搜索的人。是的,我知道它在谷歌文檔中有所描述(並在上面的帖子中提到過),我讀到了,但這對我不好(是的,我可能太傻了))。我不清楚如何設計能夠處理不同屏幕尺寸的佈局。當我需要為不同的屏幕實現“靈活的”UI佈局時,我討厭DP概念等等。(嘿iOS開發人員 - 是的,你是對的故事板概念)。

不幸的是,Android的UI概念並不差,但缺乏iOS Storyboard功能。在Android中設計靈活的UI並不容易(最好)。

這篇文章幫助我了解Android中的操作,以便為不同的屏幕尺寸製作佈局:

JMSTUDIO博客: - 決定Android App屏幕尺寸

如何為不同屏幕尺寸的Android應用程序設計UI

要為不同的屏幕尺寸設計應用程序UI,我們的初始設計必須滿足每個屏幕尺寸所需的最小空間。Android為每種通用屏幕類型定義最小大小(以dp為單位)。這是Android屏幕尺寸指南。當我們以dp獲得屏幕尺寸時,我們還不足以設計Android應用UI。對於每個屏幕尺寸,我們需要為每個密度準備圖形和位圖圖像。這是Android屏幕密度指南。

為了便於計算,我們可以遵循四個廣義密度之間的3:4:6:8縮放比例。如果我們為ldpi設備創建一個36×36像素的圖片,其餘密度圖片大小為mdpi為48×48,hdpi為72×72,xhdpi為96×96。

如何在Photoshop中設計Android應用程序UI

由於密度獨立單元dp,許多設計人員在photoshop或其他基於像素的圖形設計工具中設計Android應用UI時遇到問題。設計師不知道如何將dp映射到像素。Google也沒有為他們提供明確的Android UI設計指南,儘管他們提供了dp和像素轉換的基本公式。

作為Android的定義,1pd等於160ppi設備(mdpi)下的1px。因此,我們希望為具有mdpi密度的xlarge Android設備設計Android應用程序,我們可以將像素大小定義為像素寬度為960像素,高度為720像素; 遵循相同的映射規則,我們可以獲得以下Android App屏幕尺寸UI設計指南:

增加:如果您對“靈活”UI感興趣,請查看此庫:提供新大小單元的Android SDK - sdp(可擴展的dp)。這個尺寸單位隨屏幕尺寸而變化(這也在答案中提到,關於SDP圖書館)

ADDED2 Google終於理解了iOS Storeboard UI概念的實用性,適用ConstraintLayout於Android世界:使用ConstraintLayout構建響應式UI


PX

像素 - 對應於屏幕上的實際像素。

dp或dip

密度無關像素 - 基於屏幕物理密度的抽象單元。 這些單位相對於160 dpi的屏幕,因此一個dp是160 dpi屏幕上的一個像素。

使用dp:

密度獨立性 - 當您的應用程序在具有不同密度的屏幕上顯示時保留用戶界面元素的物理大小(從用戶的角度來看),從而實現“密度獨立性”。 (即)圖像在不同類型的屏幕中看起來應該相同(不放大或縮小)。

SP

與比例無關的像素 - 這與dp單位類似,但它也可以通過用戶的字體大小首選項進行縮放。

http://developer.android.com/guide/topics/resources/more-resources.html#Dimension


任何與文本和外觀大小相關的內容都必須使用sppt 。 然而,任何與控件大小,佈局等相關的內容都必須與dp一起使用。

您可以在其位置使用dpdip


我已經計算了下面的公式,使轉換dpidpsp


在回答這個問題之前,讓我先減少單位數量。所以這裡你去:dp或dip都是相同的,並且被稱為與密度無關的像素

1. px - 代表像素。像素是一個點,在屏幕上指向。通常在移動行業中,它以ppi(每英寸像素數)來度量。屏幕分辨率與ppi成正比,每英寸像素數越大,屏幕分辨率越高。

例如,如果您繪製的尺寸為200像素 * 200像素的圖像,則其高分辨率設備與低分辨率設備的外觀必須不同。原因是低分辨率手機上的200像素圖像看起來比高分辨率設備上的圖像大。

下圖顯示了不同手機上相同圖像的分辨率 -

  • 具有高屏幕分辨率的手機

  • 手機屏幕分辨率低

2. dip或dp - 一個基於屏幕物理密度的抽象單元。這些單位相對於160 dpi的屏幕,因此一個dp是160 dpi屏幕上的一個像素。dp與像素的比率將隨著屏幕密度而變化,但不一定是成正比的。“密度獨立性”是指在具有不同密度的屏幕上統一顯示UI元素。

  • 顯示80px(左側圖像)80dp(右側圖像)的圖像。結帳區別。

dp等於屏幕上的一個物理像素,密度為160。要計算dp:

dp =(寬度,以像素為單位* 160)/屏幕密度

3. sp - 代表可伸縮像素。通常,sp用於UI上的文本,sp保留字體設置。例如,如果用戶選擇的字體大於30 sp,則根據用戶偏好自動縮放以顯示大字體。


這是Android使用的公式:

px = dp *(dpi / 160)

其中dpi是以下屏幕密度之一。 有關所有可能密度的列表, 請轉到此處

它定義了“DENSITY_ *”常量。

  • ldpi(低)~120dpi
  • mdpi(中)~160dpi
  • hdpi(高)~240dpi
  • xhdpi(超高)~320dpi
  • xxhdpi(extra-extra-high)~480dpi
  • xxxhdpi(額外超高)~640dpi

這裡開始

如果你知道你的屏幕dpi,這將在px和dp之間進行翻譯時解決很多困惑。

所以,假設你想要一個60 dp的圖像用於hdpi屏幕,那麼物理像素大小為60 dp是:

px = 60 * (240 / 160)

dpi -

  • 每英寸點數
  • 測量屏幕的像素密度。

px - 像素

  • 用於映射屏幕像素

pt - 分

  • 相對於物理屏幕尺寸,大約1/72英寸。

英寸 - 相對於物理屏幕尺寸(1英寸= 2.54厘米)。

mm-毫米 - 相對於物理屏幕尺寸。

sp - scale-independent pixel。

  • 根據用戶的字體大小首選項。
  • 字體應該是'sp'。

蘸 -

  • dip == dp
  • 密度獨立像素。
  • 它根據屏幕密度而變化。
  • 在160 dpi屏幕中,1 dp = 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  

dpdip 。 用於所有事情(邊距,填充等)。

僅對{text-size}使用sp

為了在不同的屏幕密度上獲得相同的大小,Android會在運行時將這些單位轉換為像素,因此您無需進行棘手的數學運算。

查看不同屏幕尺寸上pxdpsp之間的差異。

來源: Android編程:大書呆子牧場指南


基本上px應用的唯一時間是一個px,如果你想在屏幕上只有一個像素,就像分頻器一樣:

在> 160 dpi時,您可能會得到2-3個像素,

在> 120 dpi時,它將舍入為0。


來自Android開發者文檔

  1. PX
    像素 - 對應於屏幕上的實際像素。


  2. 英寸 - 基於屏幕的物理尺寸。
    1英寸= 2.54厘米

  3. 毫米
    毫米 - 基於屏幕的物理尺寸。

  4. PT
    點數 - 基於屏幕物理尺寸的1/72英寸。

  5. dpdip
    密度非依賴像素 - 基於屏幕物理密度的抽象單元。 這些單位相對於160 dpi的屏幕,因此一個dp是160 dpi屏幕上的一個像素。 dp與像素的比率將隨著屏幕密度而變化,但不一定是成正比的。 注意:編譯器同時接受“dip”和“dp”,但“dp”更符合“sp”。

  6. SP
    與比例無關的像素 - 這與dp單位類似,但它也會根據用戶的字體大小首選項進行縮放。 建議您在指定字體大小時使用此單位,以便根據屏幕密度和用戶偏好調整它們。

了解Android中的密度獨立性

+----------------+----------------+---------------+-------------------------------+
| Density Bucket | Screen Density | 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 | 
+----------------+----------------+---------------+-------------------------------+
+---------+-------------+---------------+-------------+--------------------+
| Unit    | Description | Units Per     | Density     | Same Physical Size | 
|         |             | Physical Inch | Independent | On Every Screen    | 
+---------+-------------+---------------+-------------+--------------------+
| px      | Pixels      | Varies        | No          | No                 | 
+---------+-------------+---------------+-------------+--------------------+
| in      | Inches      | 1             | Yes         | Yes                | 
+---------+-------------+---------------+-------------+--------------------+
| mm      | Millimeters | 25.4          | Yes         | Yes                | 
+---------+-------------+---------------+-------------+--------------------+
| pt      | Points      | 72            | Yes         | Yes                | 
+---------+-------------+---------------+-------------+--------------------+
| dp      | Density     | ~160          | Yes         | No                 | 
|         | Independent |               |             |                    | 
|         | Pixels      |               |             |                    | 
+---------+-------------+---------------+-------------+--------------------+
| sp      | Scale       | ~160          | Yes         | No                 | 
|         | Independent |               |             |                    | 
|         | Pixels      |               |             |                    | 
+---------+-------------+---------------+-------------+--------------------+

更多信息也可以在Google Design Documentation中找到

要在真實設備上計算尺寸,可以使用this應用。


幾乎所有關於此以及如何獲得對具有不同尺寸和密度的多個屏幕的最佳支持在這裡都有很好的記錄:

屏幕尺寸
實際物理尺寸,以屏幕對角線測量。 為簡單起見,Android將所有實際屏幕尺寸分為四種通用尺寸:小尺寸,普通尺寸,大尺寸和超大尺寸。

屏幕密度
屏幕物理區域內的像素數量; 通常稱為dpi(每英寸點數)。 例如,與“正常”或“高”密度屏幕相比,“低”密度屏幕在給定物理區域內具有更少的像素。 為簡單起見,Android將所有實際屏幕密度分為六種通用密度:低,中,高,超高,超高和超額外超高。

取向
從用戶的角度看屏幕的方向。 這可以是橫向或縱向,這意味著屏幕的寬高比分別為寬或高。 請注意,默認情況下,不僅不同的設備在不同的方向上運行,但是當用戶旋轉設備時,方向可以在運行時更改。

解析度
屏幕上的物理像素總數。 添加對多個屏幕的支持時,應用程序無法直接使用分辨率; 應用程序應僅關注屏幕尺寸和密度,如通用尺寸和密度組所指定。

密度無關像素(dp)
在定義UI佈局時應使用的虛擬像素單元,以與密度無關的方式表達佈局尺寸或位置。 與密度無關的像素相當於160 dpi屏幕上的一個物理像素,這是系統為“中等”密度屏幕假定的基線密度。 在運行時,系統根據使用的屏幕的實際密度,根據需要透明地處理dp單元的任何縮放。 dp單位到屏幕像素的轉換很簡單: px = dp * (dpi / 160) 。 例如,在240 dpi屏幕上,1 dp等於1.5個物理像素。 在定義應用程序的UI時,應始終使用dp單位,以確保在具有不同密度的屏幕上正確顯示UI。

如果您對為多種類型的設備開發Android應用程序非常認真,那麼您應該至少閱讀一次屏幕支持開發文檔。 除此之外,了解具有特定屏幕配置的活動設備的實際數量始終是一件好事。


請閱讀社區維基的答案。下面提到的是除上述答案之外還需要考慮的一些信息。

sp =與尺度無關的像素

dp =密度獨立像素

dpi =密度像素

我已經完成了上述答案......沒有找到完全正確的答案。sp表示文本大小,dp表示佈局邊界 - 標準。但是,如果在大多數設備中不小心使用,文本大小的sp將破壞佈局

sp取設備的文本大小,而dp取設備密度標準(永不改變設備)假設100sp文本佔用80%的屏幕或100%的屏幕,具體取決於設備中設置的字體大小

您也可以使用sp作為佈局邊界,它將工作:) 沒有標準的應用程序使用sp作為整個文本

考慮到UX,使用sp和dp作為文本​​大小。

  • 不要在工具欄中使​​用sp作為文本​​(可以使用android dimensions available或dp)
  • 不要在小有界按鈕,非常小的文本等中使用sp作為文本

有些人在他們的手機中使用巨大的FONT以提高可讀性,給他們提供小的硬編碼文本將成為UX問題。在必要時將sp放入文本,但請確保它不會破壞佈局。

同樣,如果您有一個支持所有維度的應用程序,添加xxxhdpi資產會大大增加應用程序的大小。但是現在xxxhdpi手機很常見,所以我們必須在側欄,工具欄和底欄中至少包含xxxhdpi資產。最好轉移到矢量圖像,以便為所有屏幕尺寸提供統一且質量更好的圖像。


移動電話的屏幕由數千個稱為像素(px)的小點組成。像素是製作圖像的最小元素。製作圖片或措辭的像素數量越多,它就越清晰,使智能手機屏幕更容易閱讀。

屏幕分辨率是根據屏幕上的像素數量來衡量的。屏幕分辨率是購買設備時常用的規格,但在設計Android時實際上並沒有那麼有用,因為根據像素思考屏幕會忽略物理尺寸的概念,而觸摸設備確實非常重要。

密度獨立像素(dp或dip)允許設計人員創建以預期方式出現的資產,無論目標設備的分辨率或密度如何。

密度無關像素(dp或dip)等於基線密度處的一個像素或160dpi(每英寸點數)。

1 px / 1dp = 160 dpi / 160 dpi

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

哪裡,

dpi是每英寸的點數

因此,在320 dpi時,1 dp等於2 px。

px / dp = dpi / 160dpi

每英寸點數(dpi)是顯示屏上的銳度(即,照射點的密度)的度量。給定圖像分辨率的每英寸點數將根據整個屏幕尺寸而不同,因為相同數量的像素在不同的空間上展開。

使用與密度無關的像素有助於我們處理一種情況,例如您有兩個具有相同像素分辨率但空間不同的設備。假設在一種情況下,平板電腦和手機分別具有相同的像素分辨率1280×800像素(160dpi)和800×1280像素(320dpi)。

現在,由於平板電腦處於基線密度(160 dpi),其物理和密度無關的像素大小相同,為1280 x 800.另一方面,手機的像素密度更高,因此它的密度獨立像素數是物理密度的一半。像素。因此,手機具有400 x 640密度獨立像素。因此,使用與密度無關的像素可以更容易精神地描繪平板電腦比手機具有更多空間。

同樣,如果你有兩個屏幕尺寸相似但像素密度不同的設備,比如一個是800 x 1280像素(320 dpi),另一個是400 x 640像素(160 dpi),我們不需要完全定義這兩個設備的不同佈局,因為我們可以根據密度無關的像素測量資產,這對於兩個設備都是相同的。

800 x 1280像素(320dpi)= 400 x 640密度獨立像素(dp)

400 x 640像素(160 dpi)= 400 x 640密度獨立像素(dp)

與比例無關的像素(sp)是字體大小的首選單位。出於輔助功能,Android允許用戶自定義設備的字體大小。閱讀文本有困難的用戶可以增加設備的字體大小。您通常可以在手機或平板電腦的顯示設置中以字體大小找到此選項。它通常也可通過輔助功能設置獲得。

對於與比例無關的像素,當設備的字體大小正常或100%時,16 sp與16 dp完全相同。但是當設備的字體大小很大時,例如125%,16 sp將轉換為20 dp或1.25乘以16。

如果使用dp作為字體大小的單位,則無論用戶是否具有自定義設備的字體大小,該文本都具有特定的物理大小。使用sp單位將為視力受損的人提供更好的體驗。

參考Udacity,谷歌


這是我的解決方案, 從API 15開始可以完美工作。 此解決方案保留了所有默認的按鈕單擊效果,如材質RippleEffect 。 我沒有在較低的API上測試它,但它應該可以工作。

你需要做的是:

1)創建只更改colorAccent的樣式:

<style name="Facebook.Button" parent="ThemeOverlay.AppCompat">
    <item name="colorAccent">@color/com_facebook_blue</item>
</style>

我建議使用ThemeOverlay.AppCompat或主AppTheme作為父母,以保留其餘的樣式。

2)將這兩行添加到您的button小部件:

style="@style/Widget.AppCompat.Button.Colored"
android:theme="@style/Facebook.Button"

有時,您的新colorAccent未在Android Studio預覽中顯示,但當您在手機上啟動應用程序時,顏色將會更改。

示例按鈕小部件

<Button
    android:id="@+id/sign_in_with_facebook"
    style="@style/Widget.AppCompat.Button.Colored"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="@string/sign_in_facebook"
    android:textColor="@android:color/white"
    android:theme="@style/Facebook.Button" />





android android-layout user-interface dimension units-of-measurement