當前位置:首頁 » 安卓系統 » 安卓dp是如何計算的

安卓dp是如何計算的

發布時間: 2023-06-07 21:45:04

❶ 一篇文章幫你理清pt,px, ppi,dpi,dp,sp

作為一個新人,在做移動端UI設計的時候,往往對px,pt,ppi,dpi,dp,sp不是十分清楚,一倍圖二倍圖三倍圖如何換算,導致切圖時不知如何導出,本人在學習過程中整理匯總了一些相關知識,並盡量用最簡單得語言解釋。設計師在設計時可以進行參考。(如發現文中出現錯誤,請聯系我更正)。

名詞解釋 :

    點pt : point,印刷行業常用單位,等於1/72英寸

     像素px :pixel,電子屏幕上影像成像的基本單位。

     長度單位 dp: dip ,Density-independent pixel, 是安卓開發用的長度單位,1dp表示在屏幕像素點密度為160ppi時1px長度

    字體大小sp : scale-independent pixel,安卓開發用的字體大小單位。

    點密度dpi : dot per inch,每英寸多少點,值越高圖片越細膩。屬於谷歌旗下第一款Android設備為160dpi,規定一倍圖為160dpi。    

     像素密度ppi :pixel per inch,每英寸像素數,值越高屏幕越細膩。

面積相等的區域里,塞進了多少個像素,就代表像素密度有多大,塞進的像素越多即像素密度越大,肉眼所見細膩。如圖1個方塊代表1個像素,同一個區域里,100X100px的區域塞進去像素更多,顯示時也會更清晰細膩。

計算公式及關系:

px與pt:1pt= (DPI / 72) px

即ps中,當畫布解析度為72時,pt=1px; 當新建畫布解析度為72*2=144ppi時,1pt=2px

dpi與ppi:安卓1倍圖(163dpi)=ios1倍圖(160ppi),dpi=ppi

 注意:當ppi計算出來>=300,肉眼就已經分辨不出其區別。

 以iphone3GS(320*480px/3.5 inch)為例 , 為ios1倍圖

接下來,我將用部分主流機型舉例:由 得,

iPhone 8 (750*1334px/4.7inch) 326 163*2      為2倍圖

iPhone xr (828*1792px/6.1inch) 319 163*2     為2倍圖

iPhone xs (1125*2346/5.8inch) 462 163*3      為3倍圖

用這個公式,就可以大致判斷每個機型應該是幾倍圖。其他就不在詳細計算了,以1倍的mdpi為基準,像素密度更高或者更低的設備,只需乘以相應的倍率,就能得到與基準倍率相近的顯示效果。上圖:

px和dp: 1dp=(屏幕ppi/ 160)px,即1dp定義為屏幕密度值為160ppi時的1px

以WVGA屏為例,該屏幕為480px*800px,按3.8寸屏算,點密度 √ (480^2 + 800^2) / 3.8 = 245,約等於240,對應於hdpi屏幕,所以該屏幕1dp=1.5px。安卓端屏幕大小各不相同,根據其像素密度,分為以下幾種規格:

1dp定義為屏幕密度值為160ppi時的1px,即在mdpi時,1dp = 1px。 以mdpi為標准,這些屏幕的密度值比為:ldpi : mdpi : hdpi : xhdpi : xxhdpi = 0.75 : 1 : 1.5 : 2 : 3;即,在xhdpi的密度下,1dp=2px;在hdpi情況下,1dp=1.5px。其他類推。

dp和sp:都是安卓的開發單位,dp是長度單位,sp是字體單位,可根據用戶字體大小進行縮放,一般認為1dp=1sp。

Android系統允許用戶自定義文字尺寸大小(小、正常、大、超大等等,當文字尺寸是「正常」時1sp=1dp,而當文字尺寸是「大」或「超大」時,1sp>1dp。

總結:

1. 在畫布解析度=72ppi時,1pt=1px

2.ppi=dpi,計算公式(√ (屏幕橫向像素點x^2 + 屏幕縱向像素點y^2)/屏幕尺寸inch)

3. 1dp=(屏幕ppi/ 160)px

4.1dp=1sp

❷ 像素px、解析度、ppi、dpi、dp(dip)

屏幕尺寸(Screen Size): 屏幕對角線的長度。iPhone5屏幕尺寸為4英寸、iPhone6屏幕尺寸為4.7英寸,指的是顯示屏對角線的長度。 1 inch = 2.54cm = 25.4mm
解析度:屏幕上的像素總數。常用的表現形式如:1280x720, 1920x1080等。

px,pixel,像素,電子屏幕上組成一幅圖畫或image的基本單元。
pt, point,點,印刷行業常用單位,等於1/72英寸。
ppi,pixel per inch,每英寸像素數,值越高,屏幕越細膩。
dpi, dot per inch,每英寸多少點,該值越高,則圖片越細膩。
dp,dip, Density-independent pixel,安卓開發用的長度單位。以160ppi為標准,和iPhone的scale差不多的意思。安卓用dp適配,系統會自動將dp轉換為px。當屏幕像素點密度為160ppi時,1dp=1px。

當圖片的解析度是72ppi(dpi)時,1pt = 1px;
當圖片的解析度是72*2ppi(dpi)時,1pt = 2px;

dpi最初用於衡量列印物上每英寸的點數密度,DPI值越大圖片越精細。當DPI的概念用在計算機屏幕上時,就應稱之為ppi。同理: PPI就是計算機屏幕上每英寸可以顯示的像素點的數量。在電子屏幕顯示中ppi和dpi是一樣的。

假設屏幕解析度為W H(px),物理尺寸為a b(inch),
則我們常說的屏幕尺寸c(如5.0英寸)其實是對角線的長度,因此

則像素密度(PPI),指的是屏幕單位長度的像素數

由此我們推理出:

因此我們可以得出PPI( DPI)計算公式:

dp,獨立像素,虛擬單位,又稱設備無關像素。1dp的長度相當於一個160dpi的屏幕上一個物理像素的長度。而160dpi的屏幕則是被android定義為基準的屏幕(mdpi)。在app運行的時候,android會將dp轉為實際像素進行布局。轉換的公式為:
px = dp * (dpi / 160)。
dp為安卓開發時的基本長度單位,根據不同的屏幕解析度,與px有不同的對應關系。根據其像素密度,我們將安卓端屏幕分為以下幾種規格:

1dp即為當屏幕密度值為160ppi時,1pt=1px。則,在上表中,當密度為mdpi時,1dp = 1px。 以mdpi為標准,上表中屏幕的密度值比分別為:

即,在xhdpi的密度下,1dp=2px;在hdpi情況下,1dp=1.5px。其他類推。

❸ android 屏幕適配基礎知識

最近參考 今日頭條演算法 ,優化了項目的屏幕適配策略。下面是適配過程中的一些心得,部分內容來源於網路。

舉個例子:屏幕解析度為:1920*1080,屏幕尺寸為5吋的話,那麼dpi為440。

dp就是密度自適應的像素。1dp表示 在dpi為160的設備上的一顆像素
px與dp的換算公式px = dp * (dpi / 160),很顯然,由於相同解析度但不同屏幕大小的設備dpi是不同的,導致px和dp的基本不存在一個固定的換算關系,為了方便屏幕適配,Android設置了6個通用的密度,換算px與dp時採取通用密度計算,而非設備實際的密度。

以下為6種通用密度,以及其最小的解析度

得到上面通用密度之後,我們換算dp與px多了一種簡便方式。Android系統用mdpi(160dpi)作為基準,此時1px = 1dp,又有px = dp * (dpi / 160),所以我們可以很容易的得到以下換算:

sp在dp的基礎上引入了scaleFactor變數,一般用於字型大小,可在系統設置里調大。

同一張圖片放到以上4個解析度類型的文件夾里,在頁面上呈現的效果如下

實際呈現的演算法為: 圖片尺寸 * 系統density / 文件夾 density
因為圖片尺寸、系統density都是固定的,因此圖片最終尺寸表現為: 圖片放的位置越"low",呈現的尺寸越大

比如 圖片寬度200px,系統 density =3,則圖片寬度

下面是詳細的解釋

我們知道,不管在布局文件中填寫的是什麼單位,它最後都會被系統轉化為 px。系統的轉換演算法如下:

可以看到 px = dp*density 。

橫向適配的最終目的:讓100dp的寬度,在各個機型上,在屏幕上所佔的 比例相同
其核心演算法是px = dp* density。通過修改density這個變數,我們可以讓px和畫布標注的px值一致,達到適配的效果。

美工同學提供的畫布寬度為 750px(iphone6) ,開發中,我們對這些px標注 除2 得到dp值進行使用。
那麼density如何求出呢? 根據系統演算法px = dp*density,反推 density =px/dp
拿橫向適配畫布, density對於不同解析度的手機修改後如下:

375是我們拿UI畫布橫向解析度750/2得出。

❹ Android中解析度,DPI,DP與PX對應關系

解析度就是手機屏幕的像素點數。一般為屏幕的「寬×高」,例如解析度有720×1280的手機設備,表示此屏幕在寬度方向有720個像素點,在高度方向有1280個像素點。

按屏幕對角測量的實際物理尺寸。為簡便起見,Android 將所有實際屏幕尺寸分組為四種通用尺寸:小、 正常、大和超大,以英寸(inch)為單位。例如有個5寸的手機設備,是指對角線的尺寸,5寸×2.54厘米/寸=12.7厘米。

就是每英寸的像素點數,數值越高當然顯示越清晰,通常 與「正常」或「高」密度屏幕相比,「低」密度屏幕在給定物理區域的像素較少。

在定義 UI 布局時應使用的虛擬像素單位,用於以密度無關方式表示布局維度 或位置。
密度無關像素等於 160 dpi 屏幕上的一個物理像素,這是 系統為「中」密度屏幕假設的基線密度。在運行時,系統 根據使用中屏幕的實際密度按需要以透明方式處理 dp 單位的任何縮放 。dp 單位轉換為屏幕像素很簡單: px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等於 1.5 物理像素。在定義應用的 UI 時應始終使用 dp 單位 ,以確保在不同密度的屏幕上正常顯示 UI。

大多數情況下,確保應用中的屏幕獨立性很簡單,只需以適當的密度獨立像素( dp 單位)或 "wrap_content" 指定所有 布局尺寸值。系統然後根據適用於當前屏幕密度的縮放比例適當地縮放點陣圖可繪制對象,以 適當的大小顯示。

如上表所示,現在我們在mdpi下設計了一個48x48的應用圖標,那麼在ldip下大小縮小0.75倍為36x36,在hdip下放大1.5倍為72x72,在xhdpi下放大2倍為96x96,在xxhdpi下放大3倍為144x144,在xxxhdpi下放大4倍為192x192.

android對於不同dpi設備提供了5個目錄存放圖片,使開發人員根據實際需要對圖片適配。一般情況需要UI根據一種DPI密度、或解析度的設備設計UI,根據不同dpi的比例出圖,一般需要xhdpi、xxhdpi兩套圖,即2x、3x圖。
計算相關公式:
px = dpValue * density + 0.5f;
dp = pxValue / density + 0.5f;

❺ Android中常見的單位ppi,dp,dpi,sp,px

在android 開發過程中,我們使用的單位比較少,一般情況下在描述字體大小的時候我們通常用sp,而在設置間距的時候我們用dp,除此之外很少再用到其他單位,而且很多時候我們用著用著就習慣了,也不去探究為什麼這么寫,可不可以用其他單位,每個單位到底代表著什麼意思,所以說,習慣真的很可怕呀。今天,我們就來一探究竟,看看這些單位背後的含義。

像素即是屏幕上顯示數據的最基本的點,在PS裡面也是其最根本的單位,所有的圖形都是在此基礎上生成的,平時我們經常講的手機屏幕解析度就是以像素作為單位的,比如在android中我們經常說的手機像素是1080X1920,其實它所表達的意思是在該手機上面在橫向上面有1080個像素點,在縱向上有1920個像素點。

在android中用來形式字體大小的單位,正常情況下會按照手機系統設置的文本大小來顯示文字,但是同時也會與系統設置的文本保持一致,比如在有些老年機上面為了更好的操作手機有些人會將字體設置為較大字體,這個時候使用sp作為單位的字體也會隨之變大,但是如果將字體大小的單位設置為dp,則不會隨著系統字體的變化而變化。

在每次的手機廠商新品發布會上,我們都會聽到關於手機的介紹,比如手機的屏幕解析度,多大尺寸等等。而當我們知曉一個手機的屏幕分辯率和手機尺寸的時候,就可以計算出手機的物理像素密度,其計算公式為:

需要注意的是,PPI是Android手機物理像素密度,而非在Android開發過程中我們經常說到的像素密度。

屏幕密度與dpi密切相關,dpi是每英寸的點數。也就是說,密度越大,每英寸內容納的點數就越多。

在android.util包下有個DisplayMetrics類可以獲得密度相關的信息。最重要的是densityDpi這個成員,它有如下幾個常用值:

DENSITY_LOW = 120

DENSITY_MEDIUM = 160 //默認值

DENSITY_TV = 213 //TV專用

DENSITY_HIGH = 240

DENSITY_XHIGH = 320

DENSITY_400 = 400

DENSITY_XXHIGH = 480

DENSITY_XXXHIGH = 640

dpi的值主要是通過displayMetrics獲取的,獲取方式為:

val densityDpi = resources.displayMetrics.densityDpi。

dp和dip是一樣的,設備獨立像素,這個和設備硬體有關,不同設備有不同的顯示效果。而通常在做android項目的時候,為了適配市場上面眾多的手機屏幕分辯率,我們一般都會採用dp。dp是Android基於物理設備的PPI抽象出來的一個單位。它是以160dpi的屏幕為基準定義的,在160dpi的屏幕上1dp=1px,那麼由此我們就可以得出其計算公式:

換算公式:1dp = (屏幕ppi/160)px或者是px = (屏幕ppi/160)*1dp。舉個例子:假設ppi = 320,那麼1dp = 2px。

下面我們來演練一下:

如圖所示,手機的屏幕分辯率為1080X1920,尺寸為5寸,從而計算得出PPI的值為440,再通過PPI計算出1dp 約等於3px。假設現在美工給的圖上面有一個a圖標,距離頂部的距離為30px,那麼根據最終我們的換算結果可知,我們設置為10dp就可以達到完美的顯示效果。

❻ Android 關於"尺寸"的那些事(dp,dip,sp,pt,px...)

屏幕大小:屏幕大小是手機對角線的物理尺寸,以英寸inch為單位。比如我的Mix 2手機屏幕大小為5.99 inches,意味著我的屏幕對角線長度為5.99inches = 5.99 * 2.54 = 15.2146cm

解析度:屏幕的像素點數,一般表示為a*b。例如某手機解析度為21601080,意味著手機屏幕的豎直方向(長)有2160個像素點,水平方向(寬)有1080個像素點。

px :Pixels ,像素;對應屏幕上的實際像素,是畫面中最小的點(單位色塊),像素大小沒有固定長度值,不同設備上1個單位像素色塊大小不同。

這么說可能有點陌生,用屏幕解析度來說,今年流行起來的「全面屏」解析度是 2160*1080,但是你也可以發現,雖然很多全面屏手機解析度一樣,但是明顯看得出來屏幕大小不一樣,這也解釋了「不同設備像素色塊大小是不同的」。

pt :1pt=1/72 inch,用於印刷業,非常簡單易用;

dpi :Dots Per Inch,每英寸點數;詳見ppi

ppi :Pixels Per Inch,每英寸像素數;數值越大顯示越細膩。計算式:ppi = 屏幕對角線像素數 / 屏幕對角線長度。

還是舉全面屏的例子,解析度2160*1080,屏幕大小是5.9inches,勾股定理可以得到對角線像素數大約是2415,那麼ppi = 2415 / 5.99 = 403.

事實上dpi 和 ppi 一定程度上可以劃等號,都表示像素密度,計算方式完全一致,只不過使用場景不一樣。dpi中的dots點屬於列印或印刷等領域,例如drawable 文件對應的就是dpi,而ppi中的pixel屬於屏幕顯示等領域

dp/dip : Density-independent Pixels,密度無關像素 - 基於屏幕物理密度的抽象單位。1dp等於 160 dpi 屏幕上的dpx,這是 系統為「中」密度屏幕假設的基線密度。在運行時,系統 根據使用中屏幕的實際密度按需要以透明方式處理 dp 單位的任何縮放 。dp 單位轉換為屏幕像素很簡單:px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等於 1.5 物理像素。在定義應用的 UI 時應始終使用 dp 單位 ,以確保在不同密度的屏幕上正常顯示 UI。

如果看完文章還是覺得很懵,那麼可以直接記住: 1dp單位在設備屏幕上總是等於1/160 inch。

sp :Scale-independent Pixels ,與 dp 單位相似,也會根據用戶的字體大小偏好進行縮放。

首先我們放上源碼中對尺寸單位的轉換

可以看到,輸入值類型為dp時,返回 value * DisplayMetrics.density,到這里我們可能會發懵:嗯?不對啊,前面我們不是通過px 和 dp 的換算公式來計算的么,怎麼這里就簡簡單單乘了一個DisplayMetrics.density?不要慌,我們先看看源碼中對DisplayMetrics.density的介紹。

源碼注釋中說到「在160dpi的屏幕下,density的值為1,而在120dpi的屏幕下,density的值為0.75」,我們可以大膽的猜測一下,120dpi下的density=0.75的原因是120dpi * 1 /160dpi=0.75。實際上,也就是這么回事。我們下面會仔細的分析。

需要補充一下,通常意義上Android 屏幕的密度,指的是像素密度dpi/ppi,對應於源碼中的DisplayMetrics.densityDpi。

為什麼引入dp?

Android 引入了dp這一單位,使得不論多大屏幕,多大dpi,顯示的效果始終保持一致。

但是根據前面我們提到的px與dp的換算公式px = dp * (dpi / 160),很顯然,由於相同解析度但不同屏幕大小的設備dpi是不同的,導致px和dp的基本不存在一個固定的換算關系,為了方便屏幕適配,Android設置了6個通用的密度,換算px與dp時採取通用密度計算,而非設備實際的密度。

以下為6種通用密度,以及其最小的解析度

得到上面通用密度之後,我們換算dp與px多了一種簡便方式。前面我們提到Android將mdpi作為基準,此時1px = 1dp,又有px = dp * (dpi / 160),所以我們可以很容易的得到以下換算:

還記不記得前面源碼中的density屬性,實際上DisplayMetrics.density = dpi / 160 ,表示的就是在某個通用密度下dp與px的換算比(1dp/1px的值)

這部分其實和程序員自身已經關系不大了,畢竟參與工作之後這些都是UI人員的活兒了。不過鑒於現在我還只是一枚在校生,還是記下來以免自己遺漏吧。

建議在xhdpi中作圖

原因嘛,首先現在主流解析度是1080p,以及最近流行起來的全面屏18:9,而xhdpi對應720p,向低dpi兼容自然沒問題,即便在xxhdpi中顯示,也會有個不錯的效果。而如果以1920*1080作圖,顯然圖片素材佔用的內存很大,而且也會增大應用安裝包的大小。

只有一個原則:資源放入對應dpi的文件夾中,Android會機智的載入合適的資源。

以drawable資源為例:

我們平時開發小項目&對UI要求不高時,只使用一套xhdpi的資源就足夠了,雖然這可能會導致在hdpi及以下的手機中有些卡頓,因為xhdpi的圖片運行在hdpi及以下的手機上會比較吃內存,不過無傷大雅。

而如果不為圖片資源犯愁時(有UI人員的支持,就是任性),就可以添加所有dpi的資源。當然,重點還是要滿足ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12的規律。

好像說了不少廢話,哈哈,大概就這么多吧。

❼ 手機上的圖標是32×32dp,dp是什麼意思

手機上的圖標是32×32dp,dp是長度單位。設備獨立像素的意思。

dp是一種物理測量單位,基於計算機控制的坐標系統和抽象像素(虛擬像素),由底層系統的程序使用,轉換為物理像素的應用。

用途是允許移動設備軟體將信息顯示和用戶交互擴展到不同的屏幕尺寸。允許應用程序以抽象像素為單位進行測量,而底層圖形系統將應用程序的抽象像素測量值轉換為適合於特定設備的物理像素。


(7)安卓dp是如何計算的擴展閱讀

dp與ppi計算:dp = dx * (dpi / 160)。例如,在 240 dpi 屏幕上,1 dp 等於 1.5 物理像素。

Android系統以「中」密度屏幕假設的基線密度,故該公式中dpi除以160dpi。在定義應用的 UI 時應始終使用 dp 單位 ,以確保在不同密度的屏幕上正常顯示 UI。

點陣圖縮放可能導致模糊或像素化點陣圖。為避免這些偽影,應為不同的密度提供替代的點陣圖資源。

熱點內容
引流腳本什麼意思 發布:2024-04-23 17:16:49 瀏覽:395
江叔常用的密碼是多少 發布:2024-04-23 17:11:54 瀏覽:594
內存儲存公司股票 發布:2024-04-23 16:57:16 瀏覽:928
linuxrootkit 發布:2024-04-23 16:56:37 瀏覽:324
線索一這廁所的密碼是多少 發布:2024-04-23 16:48:44 瀏覽:573
河源中考成績查詢密碼是什麼 發布:2024-04-23 16:48:42 瀏覽:607
ipad解壓視頻文件 發布:2024-04-23 16:47:44 瀏覽:137
順序表是線性表的什麼存儲結構 發布:2024-04-23 16:32:28 瀏覽:454
腳本刷皮膚 發布:2024-04-23 16:12:25 瀏覽:858
共享一個ip伺服器 發布:2024-04-23 15:46:26 瀏覽:142