您好,登錄后才能下訂單哦!
常見尺寸單位
Android開發中的常用尺寸單位有如下幾種:
算不知道確切含義,相信對于以上這幾種尺寸單位大家也都比較臉熟,這里先讓我們重新認識一下它們:
在上面幾種常見的尺寸單位,dp和sp可以看做是虛擬尺寸。其中dp是與設備無關的虛擬像素單位,開發者為UI控件指定以dp為單位的大小后,在不同屏幕密度的Android設備上便能夠具有相同的物理尺寸。dp的出現讓開發者無需關注屏幕密度、物理像素之間的換算關系。sp則與dp相似,但它主要用作字體的尺寸單位,與dp的區別是:Android系統支持用戶設定字體大小,因而sp的實際大小還會根據用戶設定在原基礎上進行縮放。
下面來詳細介紹dp與sp這兩種尺寸單位。
尺寸單位詳解之dp
dp的全稱是device independent pixels,在具有不同屏幕密度的設備上,1 dp的物理大小是相同的。那么,什么是屏幕密度呢?
屏幕密度
手機的屏幕密度通常指的是手機屏幕的dpi(dots per inch),也就是每英寸的像素數。對于Android手機來說,常見的dpi有如下幾種:
在實際開發中,通常以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。
現在我們已經理解了dpi,接下來讓我們揭開dp的神秘面紗。
dp
上面我們提到了選擇dpi值160作為基準屏幕密度,這個基準屏幕密度人為建立起了dp與px間的關系:在dpi為160的Android設備上,1 dp = 1px。假設x為某UI控件以px為單位的大小,y為同一UI控件以dp為單位的大小,densityDpi表示屏幕密度,則x與y的關系為:x = y * densityDpi / 160。
介紹完了dp,接下來讓我們探究一下sp這個尺寸單位的真面目。
尺寸單位詳解之sp
在介紹sp之前,我們先來一起看下TypedValue類中包含的一個用戶將dp、sp等單位轉換為px的靜態方法:
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轉換為px,會執行如下代碼:
return value * metrics.density;
density我們在前面介紹過,指的是當前dpi與基準dpi(160)的比值。density的計算方式就是當前屏幕的dpi除以160。也就是說,在屏幕的dpi為120、160、320、480時,density的值分別為0.75、1、2、3。
若要將sp轉換為px,則會執行如下代碼:
return value * metrics.scaledDensity;
可以看到,sp轉換為px的計算公式與dp轉換為px時相似,那么scaledDensity是什么呢?實際上,scaledDensity不同于density,scaledDensity是可以動態改變的,當用戶改變了Android設備的字體縮放比例時,scaledDensity的值就會發生變化。scaledDensity的計算公式為:scaledDensity = density * fontScale。其中fontScale代表用戶設定的Android設備字體縮放比例,默認為1。也就是說,當用戶沒有改變Android設備的字體縮放比例時,sp、dp與px的換算是相同的。
多分辨率之殤
市面上存在著的各種不同分辨率的Android設備為廣大Android開發者挖了眾多的坑,比如:
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。