單位dp的最大優(yōu)勢是:
創(chuàng)新互聯(lián)建站主營柳林網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),柳林h5小程序開發(fā)搭建,柳林網(wǎng)站營銷推廣歡迎柳林等地區(qū)企業(yè)咨詢
可以防止同樣的分辨率在不同物理尺寸的屏幕上帶來的差異
可以讓UI適配得足夠精細,而不是完全等比例縮放
可以做到一定程度的定制,足夠精細
你首先要明白dp是什么,然后才知道為什么顯示成這樣。
首先,ppi是對角線的像素除以一個手機的屏幕尺寸(其實也是對角線)。
根據(jù)ppi的值,android歸一化為一個固定的數(shù)值,稱為dp,比如240,320,480等。
不同的手機,寬高的dp是不一樣的。
dp = dip : device independent pixels(設(shè)備獨立像素). 不同設(shè)備有不同的顯示效果,這個和設(shè)備硬件有關(guān),一般我們?yōu)榱酥С諻VGA、HVGA和QVGA 推薦使用這個,不依賴像素。
px: pixels(像素). 不同設(shè)備顯示效果相同,一般我們HVGA代表320x480像素,這個用的比較多。
pt: point,是一個標準的長度單位,1pt=1/72英寸,用于印刷業(yè),非常簡單易用;
sp: scaled pixels(放大像素). 主要用于字體顯示best for textsize。
由此,根據(jù) google 的建議,TextView 的字號最好使用 sp 做單位,而且查看
TextView
的源碼可知 Android 默認使用 sp 作為字號單位。
在 Android 中, 1pt 大概等于 2.22sp
以上供參考,如果 UI 能夠以 sp 為單位提供設(shè)計是最好的,如果設(shè)計中沒有 sp
的概念,則開發(fā)人員也可以通過適當?shù)膿Q算取近似值。
過去,程序員通常以像素為單位設(shè)計計算機用戶界面。例如,定義一個寬度為300像素的表單字段,列之間的間距為5個像素,圖標大小為16×16像素 等。這樣處理的問題在于,如果在一個每英寸點數(shù)(dpi)更高的新顯示器上運行該程序,則用戶界面會顯得很小。在有些情況下,用戶界面可能會小到難以看清 內(nèi)容。
與分辨率無關(guān)的度量單位可以解決這一問題。Android支持下列所有單位。
px(像素):屏幕上的點。
in(英寸):長度單位。
mm(毫米):長度單位。
pt(磅):1/72英寸。
dp(與密度無關(guān)的像素):一種基于屏幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。
dip:與dp相同,多用于android/ophone示例中。
sp(與刻度無關(guān)的像素):與dp類似,但是可以根據(jù)用戶的字體大小首選項進行縮放。
為了使用戶界面能夠在現(xiàn)在和將來的顯示器類型上正常顯示,建議大家始終使用sp作為文字大小的單位,將dip作為其他元素的單位。當然,也可以考慮使用矢量圖形,而不是用位圖
Android中,dp是Density-independent Pixels簡寫,而dip則是Density Independent Pixels,實際上指的是一個概念,都是Android的單位。
dp等同于dip,它是一個長度單位,1dp=1/160英寸。
dp這個單位的意義在于:你可以根據(jù)看到的實際大小,在應(yīng)用中設(shè)置對應(yīng)的dp值,而使得不同的設(shè)備上看起來一樣大。
詳情請見:
dp是長度單位! dp也就是dip。這個和sp基本類似。如果設(shè)置表示長度、高度等屬性時可以使用dp或sp。但如果設(shè)置字體,需要使用sp。dp是與密度無關(guān),sp除了與密度無關(guān)外,還與scale無關(guān)。如果屏幕密度為160,這時dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設(shè)還是3.2寸),而屏幕密度變成了320。那么原來TextView的寬度設(shè)成160px,在密度為320的3.2寸屏幕里看要比在密度為160的3.2寸屏幕上看短了一半。但如果設(shè)置成160dp或160sp的話。系統(tǒng)會自動將width屬性值設(shè)置成320px的。也就是160 * 320 / 160。其中320 / 160可稱為密度比例因子。也就是說,如果使用dp和sp,系統(tǒng)會根據(jù)屏幕密度的變化自動進行轉(zhuǎn)換.
在android 開發(fā)過程中,我們使用的單位比較少,一般情況下在描述字體大小的時候我們通常用sp,而在設(shè)置間距的時候我們用dp,除此之外很少再用到其他單位,而且很多時候我們用著用著就習慣了,也不去探究為什么這么寫,可不可以用其他單位,每個單位到底代表著什么意思,所以說,習慣真的很可怕呀。今天,我們就來一探究竟,看看這些單位背后的含義。
像素即是屏幕上顯示數(shù)據(jù)的最基本的點,在PS里面也是其最根本的單位,所有的圖形都是在此基礎(chǔ)上生成的,平時我們經(jīng)常講的手機屏幕分辨率就是以像素作為單位的,比如在android中我們經(jīng)常說的手機像素是1080X1920,其實它所表達的意思是在該手機上面在橫向上面有1080個像素點,在縱向上有1920個像素點。
在android中用來形式字體大小的單位,正常情況下會按照手機系統(tǒng)設(shè)置的文本大小來顯示文字,但是同時也會與系統(tǒng)設(shè)置的文本保持一致,比如在有些老年機上面為了更好的操作手機有些人會將字體設(shè)置為較大字體,這個時候使用sp作為單位的字體也會隨之變大,但是如果將字體大小的單位設(shè)置為dp,則不會隨著系統(tǒng)字體的變化而變化。
在每次的手機廠商新品發(fā)布會上,我們都會聽到關(guān)于手機的介紹,比如手機的屏幕分辨率,多大尺寸等等。而當我們知曉一個手機的屏幕分辯率和手機尺寸的時候,就可以計算出手機的物理像素密度,其計算公式為:
需要注意的是,PPI是Android手機物理像素密度,而非在Android開發(fā)過程中我們經(jīng)常說到的像素密度。
屏幕密度與dpi密切相關(guān),dpi是每英寸的點數(shù)。也就是說,密度越大,每英寸內(nèi)容納的點數(shù)就越多。
在android.util包下有個DisplayMetrics類可以獲得密度相關(guān)的信息。最重要的是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是一樣的,設(shè)備獨立像素,這個和設(shè)備硬件有關(guān),不同設(shè)備有不同的顯示效果。而通常在做android項目的時候,為了適配市場上面眾多的手機屏幕分辯率,我們一般都會采用dp。dp是Android基于物理設(shè)備的PPI抽象出來的一個單位。它是以160dpi的屏幕為基準定義的,在160dpi的屏幕上1dp=1px,那么由此我們就可以得出其計算公式:
換算公式:1dp = (屏幕ppi/160)px或者是px = (屏幕ppi/160)*1dp。舉個例子:假設(shè)ppi = 320,那么1dp = 2px。
下面我們來演練一下:
如圖所示,手機的屏幕分辯率為1080X1920,尺寸為5寸,從而計算得出PPI的值為440,再通過PPI計算出1dp 約等于3px。假設(shè)現(xiàn)在美工給的圖上面有一個a圖標,距離頂部的距離為30px,那么根據(jù)最終我們的換算結(jié)果可知,我們設(shè)置為10dp就可以達到完美的顯示效果。