Android中的常用尺寸單位(dp、sp)快速入門教程
常見尺寸單位
Android開發(fā)中的常用尺寸單位有如下幾種:
- dp (dip)
- px
- pt
- inch
- sp
算不知道確切含義,相信對于以上這幾種尺寸單位大家也都比較臉熟,這里先讓我們重新認識一下它們:
- dp (dip): 即設備無關(guān)像素(device independent pixels),這種尺寸單位在不同設備上的物理大小相同。
- px:即像素(pixel),這個不用多說。
- pt:通常用來作為字體的尺寸單位,1 pt相當于1/72英寸。
- inch:英寸,1 英寸約等于2.54厘米,主要用來描述手機屏幕的大小。
- sp:大部分人只知道它通常用作字體的尺寸單位,實際大小還與具體設備上的用戶設定有關(guān)。(如果你對"sp"的了解停留于此,那么看完這篇文章后你會更透徹的理解它^ _ ^)
在上面幾種常見的尺寸單位,dp和sp可以看做是虛擬尺寸。其中dp是與設備無關(guān)的虛擬像素單位,開發(fā)者為UI控件指定以dp為單位的大小后,在不同屏幕密度的Android設備上便能夠具有相同的物理尺寸。dp的出現(xiàn)讓開發(fā)者無需關(guān)注屏幕密度、物理像素之間的換算關(guān)系。sp則與dp相似,但它主要用作字體的尺寸單位,與dp的區(qū)別是:Android系統(tǒng)支持用戶設定字體大小,因而sp的實際大小還會根據(jù)用戶設定在原基礎(chǔ)上進行縮放。
下面來詳細介紹dp與sp這兩種尺寸單位。
尺寸單位詳解之dp
dp的全稱是device independent pixels,在具有不同屏幕密度的設備上,1 dp的物理大小是相同的。那么,什么是屏幕密度呢?
屏幕密度
手機的屏幕密度通常指的是手機屏幕的dpi(dots per inch),也就是每英寸的像素數(shù)。對于Android手機來說,常見的dpi有如下幾種:
- ldpi:對應的dpi范圍為0 ~ 120,也就是說每英寸有0到120個像素點的屏幕的屏幕密度都屬于ldpi
- mdpi:dpi范圍為120 ~ 160
- hdpi:dpi范圍為160 ~ 240
- xhdpi:dpi范圍為240~320
- xxhdpi:dpi范圍為320~480
在實際開發(fā)中,通常以dpi值120、160、240、320、480分別指代ldpi、mdpi、hdpi、xhdpi、xxhdpi。通常屏幕密度越大的手機顯示的圖像會越細膩。可以通過如下代碼獲取當前Android設備的屏幕密度:
private void getDpi() {
DisplayMetrics dm = getResources().getDisplayMetrics();
Log.i("TAG", "density = " + dm.density);
Log.i("TAG", "densityDpi = " + dm.densityDpi);
}
若我們在一臺屏幕密度為320dpi的Android手機上運行以上代碼,會得到如下輸出:
density = 2 densityDpi = 320
上面輸出中的densityDpi就是Android手機屏幕的dpi值,那么density是什么呢?實際上它代表的是當前屏幕的dpi值與基準dpi值的比值,這個基準dpi值為160。
現(xiàn)在我們已經(jīng)理解了dpi,接下來讓我們揭開dp的神秘面紗。
dp
上面我們提到了選擇dpi值160作為基準屏幕密度,這個基準屏幕密度人為建立起了dp與px間的關(guān)系:在dpi為160的Android設備上,1 dp = 1px。假設x為某UI控件以px為單位的大小,y為同一UI控件以dp為單位的大小,densityDpi表示屏幕密度,則x與y的關(guān)系為:x = y * densityDpi / 160。
介紹完了dp,接下來讓我們探究一下sp這個尺寸單位的真面目。
尺寸單位詳解之sp
在介紹sp之前,我們先來一起看下TypedValue類中包含的一個用戶將dp、sp等單位轉(zhuǎn)換為px的靜態(tài)方法:
public static float applyDimension(int unit, float value,DisplayMetrics metrics) {
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
若要將dp轉(zhuǎn)換為px,會執(zhí)行如下代碼:
return value * metrics.density;
density我們在前面介紹過,指的是當前dpi與基準dpi(160)的比值。density的計算方式就是當前屏幕的dpi除以160。也就是說,在屏幕的dpi為120、160、320、480時,density的值分別為0.75、1、2、3。
若要將sp轉(zhuǎn)換為px,則會執(zhí)行如下代碼:
return value * metrics.scaledDensity;
可以看到,sp轉(zhuǎn)換為px的計算公式與dp轉(zhuǎn)換為px時相似,那么scaledDensity是什么呢?實際上,scaledDensity不同于density,scaledDensity是可以動態(tài)改變的,當用戶改變了Android設備的字體縮放比例時,scaledDensity的值就會發(fā)生變化。scaledDensity的計算公式為:scaledDensity = density * fontScale。其中fontScale代表用戶設定的Android設備字體縮放比例,默認為1。也就是說,當用戶沒有改變Android設備的字體縮放比例時,sp、dp與px的換算是相同的。
多分辨率之殤
市面上存在著的各種不同分辨率的Android設備為廣大Android開發(fā)者挖了眾多的坑,比如:
- 需要為不同分辨率的Android設備單獨維護一套dimens文件;
- 通常UI設計師只會針對某種特定分辨率的設備為我們標注UI控件的像素大小,相信不少小伙伴都受夠了手動換算不同分辨率設備上UI控件像素大小的痛苦;
- 通常我們需要為每種分辨率的Android設備維護一個drawable文件夾以獲得比較好的圖片顯示效果,這會導致apk文件尺寸的臃腫;而且若某個drawable文件夾下的圖片需要修改,那么就需要替換其他所有drawable文件夾中對應的圖片。如果不小心漏掉了某個drawable文件夾下的圖片,則會導致該圖片在某些分辨率的手機上失真。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android 深入探究自定義view之流式布局FlowLayout的使用
FlowLayout(int align, int hgap, int vgap)創(chuàng)建一個新的流布局管理器,它具有指定的對齊方式以及指定的水平和垂直間隙,意思就是說從左上角開始添加原件,依次往后排,第一行擠滿了就換一行接著排2021-11-11
Android?廣播接收器BroadcastReceiver詳解
Android開發(fā)的四大組件分別是:活動(activity),用于表現(xiàn)功能;服務(service),后臺運行服務,不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個應用中存儲和讀取數(shù)據(jù),相當于數(shù)據(jù)庫,本篇著重介紹廣播組件2022-07-07
Android實現(xiàn)動態(tài)定值范圍效果的控件
這篇文中給大家分享一個Android的控件,這個控件實現(xiàn)是一個可以動態(tài)選擇定值范圍的效果,實現(xiàn)后的效果很不錯,對大家日常開發(fā)或許有所幫助,感興趣的朋友們可以一起來看看。2016-09-09
Android設置Padding和Margin(動態(tài)/靜態(tài))的方法實例
如何在java代碼中設置margin,也就是組件與組件之間的間距,下面這篇文章主要給大家介紹了關(guān)于Android設置Padding和Margin(動態(tài)/靜態(tài))的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-11-11
百度地圖實現(xiàn)小車規(guī)劃路線后平滑移動功能
這篇文章主要介紹了百度地圖實現(xiàn)小車規(guī)劃路線后平滑移動功能,本文是小編寫的一個demo,通過效果圖展示的非常直白,需要的朋友可以參考下2020-01-01

