當前位置:首頁 » 安卓系統 » androidpx轉dp

androidpx轉dp

發布時間: 2022-11-03 07:01:04

A. 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就可以達到完美的顯示效果。

B. 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的規律。

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

C. dp和px之間的換算公式

dp和px的換算公式 :
dp*ppi/160 = px。比如1dp x 320ppi/160 = 2px。
sp:Scale-independent pixels,它是安卓的字體單位,以160PPI屏幕為標准,當字體大小為 100%時, 1sp=1px。
dp也就是dip:device independent pixels(設備獨立像素)。
dp是一種與密度無關的像素單位,在每英寸160點的屏幕上,1dp = 1px。
px(像素):屏幕上的點。

D. 新手Android中px=dp*(dpi/160)的解釋

在160dpi的手機上1px=1dp,這句話的以上是說,手機屏幕寬頻被分割成了160塊,每一塊有一個像素點,每一塊就是一個dp。 那麼1dp=1px

而320dpi的手機上,解析度是上一個手機的兩倍,手機屏幕寬頻也被分割成了160塊,每一塊有兩個像素點,每一塊也是一個dp,那麼1dp=2px

上面分析來自於android學習手冊,360手機助手中可以下載,裡面有108個android例子,源碼文檔都可在裡面看,下面是截圖

java">importandroid.content.Context;

publicclassDensityUtil{

/**
*根據手機的解析度從dp的單位轉成為px(像素)
*/
publicstaticintdip2px(Contextcontext,floatdpValue){
finalfloatscale=context.getResources().getDisplayMetrics().density;
return(int)(dpValue*scale+0.5f);
}

/**
*根據手機的解析度從px(像素)的單位轉成為dp
*/
publicstaticintpx2dip(Contextcontext,floatpxValue){
finalfloatscale=context.getResources().getDisplayMetrics().density;
return(int)(pxValue/scale+0.5f);
}
}

E. android ui給的標注都是px怎麼轉換

android開發的單位基本上都使用pd,而pd是2px,如10px=5dp

F. 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;

G. Android 屏幕適配

1: dp: android 尺寸的基本單位。 在不同的解析度的手機裡面,1dp對應著不同數量的px, 這樣就實現了dp定義一個控制項大小的時候,在不同解析度手機里表現出相應大小的像素值。
2: 屏幕解析度: 1080下160, 表示寬度有1080個像素點而高度有2160個像素點。常見的解析度有320x480, 480x800, 720x1280, 1080x1920等。
3: 屏幕尺寸: 以寸為單位, Android設備對角線的長度
4: 像素密度: 每英寸的像素點
5: 屏幕尺寸, 解析度,像素密度 三者之間的關系:
密度(dpi)= √(寬2 + 高2)/屏幕尺寸

6: px:像素,是屏幕上顯示數據的最基本的點
7: dpi:屏幕像素密度,每英寸上的像素點數
8: sp:與dp類似,通常用於指定字體的大小,當用戶修改手機顯示的字體時,字體大小會隨之改變。

1: dp適配方案: Android自帶的原始的適配方案, 在不同的解析度手機裡面表現出相應大小的像素點。
缺點: Android的碎片化嚴重, 如果生產廠家沒有根據屏幕尺寸、解析度和像素密度的關系來規則定義, 或者出一些亂七八糟的屏幕大小,這樣的適配方案就不在適合了。

2: 寬高限定符:枚舉所有的屏幕寬高像素值,根據等比縮放去適配。如果沒有找到對應的屏幕, 則取默認的。 目前這種方案已經被棄用。

缺點:
1: 佔用資源大,會增加APK的體積。
2: 容錯機制大需要精準命中資源文件才能適配,比如1920x1080的手機就一定要找到1920x1080的限定符,否則就只能用統一的默認的dimens文件了。而使用默認的尺寸的話,UI就很可能變形。

3:AndroidAutoLayout適配方案(停止維護)

4: SW限定符適配方案:(smallestWidth最小寬度適配)
Android 會去識別屏幕可用高度或者寬度的最小尺寸的dp值。然後根據識別到的結果去對應的資源文件裡面去找尋相應的結果。
如何生成:ScreenMatch插件

此方案跟寬高限定的適配方案相比,有很好的容錯機制, 如果沒有找到對應的適配寬度, 那麼會在vlues文件裡面去找跟他最接近的寬度。

5:今日頭條適配方案:
1>: px 轉 dp 的公式 dp = px / density.不管我們設定的單位是什麼, 最終我們都會將這些單位長度轉化為px的。density就是他們的轉化比, 所以,動態改變這個轉化比也是可以達到我們適配屏幕的目的的。
2>: 通過修改density值,強行把所有不同尺寸解析度的手機的寬度dp值改成一個統一的值(在清單文件中定義),這樣就解決了所有的適配問題。
3>: Density = 當前設備屏幕總寬度(單位為像素)/ 設計圖總寬度(單位為 dp) ;
4>:引入了AndroidAutoSize屏幕適配框架:
https://github.com/JessYanCoding/AndroidAutoSize

最後, 最重要的................
點贊 點贊 點贊, 不重要的事情也就說3遍......

H. 像素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。其他類推。

I. Android UI里1px等於多少dp

dp、sp和px的區別:現在這里介紹一下dp和sp。dp也就是dip。這個和sp基本類似。如果設置表示長度、高度等屬性時可以使用dp
或sp。但如果設置字體,需要使用sp。dp是與密度無關,sp除了與密度無關外,還與scale無關。如果屏幕密度為160,這時dp和sp和px是一
樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設還是3.2寸),而屏幕密度變成了320。那麼原來TextView的寬度
設成160px,在密度為320的3.2寸屏幕里看要比在密度為160的3.2寸屏幕上看短了一半。但如果設置成160dp或160sp的話。系統會自動
將width屬性值設置成320px的。也就是160 * 320 / 160。其中320 /
160可稱為密度比例因子。也就是說,如果使用dp和sp,系統會根據屏幕密度的變化自動進行轉換。

下面看一下其他單位的含義

px:表示屏幕實際的象素。例如,320*480的屏幕在橫向有320個象素,在縱向有480個象素。

in:
表示英寸,是屏幕的物理尺寸。每英寸等於2.54厘米。例如,形容手機屏幕大小,經常說,3.2(英)寸、3.5(英)寸、4(英)寸就是指這個單位。這
些尺寸是屏幕的對角線長度。如果手機的屏幕是3.2英寸,表示手機的屏幕(可視區域)對角線長度是3.2*2.54 =
8.128厘米。讀者可以去量一量自己的手機屏幕,看和實際的尺寸是否一致。

mm:表示毫米,是屏幕的物理尺寸。

pt:表示一個點,是屏幕的物理尺寸。大小為1英寸的1/72。
原帖地址http://www.ophonesdn.com/forum/thread-1946-2-1.html

px(Pixels ,像素):對應屏幕上的實際像素點。例如,320*480的屏幕在橫向有320個象素,在縱向有480個象素。

in(Inches

,英寸):屏幕物理長度單位。每英寸等於2.54厘米。例如,形容手機屏幕大小,經常說,3.2(英)寸、3.5(英)寸、4(英)寸就是指這個單位。這
些尺寸是屏幕的對角線長度。如果手機的屏幕是3.2英寸,表示手機的屏幕(可視區域)對角線長度是3.2*2.54 =
8.128厘米。讀者可以去量一量自己的手機屏幕,看和實際的尺寸是否一致。

mm(Millimeters ,毫米):屏幕物理長度單位。

pt(Points ,磅):屏幕物理長度單位, 表示一個點,是屏幕的物理尺寸。大小為1英寸的1/72。

dp(與密度無關的像素):邏輯長度單位,在 160 dpi 屏幕上,1dp=1px=1/160英寸。隨著密度變化,對應的像素數量也變化,但並沒有直接的變化比例。
dip:與dp相同,多用於Google示例中。
sp(與密度和字體縮放度無關的像素):與dp類似,但是可以根據用戶的字體大小首選項進行縮放。

盡量使用dp作為空間大小單位,sp作為和文字相關大小單位

熱點內容
yaflinux 發布:2024-05-01 13:54:42 瀏覽:764
恆語g666參數屬於什麼配置 發布:2024-05-01 13:50:13 瀏覽:67
frp編譯openwrt 發布:2024-05-01 13:40:47 瀏覽:680
文件夾模糊不清晰 發布:2024-05-01 13:40:43 瀏覽:92
編程貓玻璃 發布:2024-05-01 13:26:53 瀏覽:747
陰陽師可以用哪些配置的機型 發布:2024-05-01 12:51:00 瀏覽:772
查看系統信息linux 發布:2024-05-01 12:03:48 瀏覽:719
腳本竊取 發布:2024-05-01 11:55:19 瀏覽:809
天龍八部撿包腳本 發布:2024-05-01 11:55:16 瀏覽:620
mf推薦演算法 發布:2024-05-01 11:39:34 瀏覽:860