最近在看了許多關于dp-px,px-dp,sp-px,px-sp之間轉化的博文,過去我比較常用的方式是:
然後看到了一種新的轉化方式,代碼如下:
碼農對TypedValue充滿好奇,通過查詢官網了解該類
TypedValue
---android.util.TypedValue
翻譯過來就是:這個類是工具類,作為一個動态容器,它存放一些資料值,這些值主要是resource中的值。
我們來了解一下:resource中到底有哪些值?layout、drawable、string、style、anim、dimens、menu、colors、ids這些值一些和螢幕适配有直接的關系。
有一些方法必然是可以讀取這些資源檔案資訊的,比如:
再看具體的方法:
其中機關為dip的,将其轉化為密度*值,也就是像素值,而機關sp的也将其轉化為px值,是以該方法可以能進行
dip-->px
sp-- >px
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, value ,DisplayMetrics );
這個方法肯定不能将sp轉化為dp,我們判斷
dp2sp(50) = 150
sp2dp(50) = 150
convertDipOrPx(50) = 150
convertPxOrDip(50) = 17
将代碼運作實際結果與判斷結果一緻。
接下來我們繼續分析
該方法系統本意是用來做什麼的?
檢視官方說明:
Converts an unpacked complex data value holding a dimension to its final floating point value.
這裡就把對應的值轉化為實際螢幕上的點值,也就是像素值。
如果是TypedValue.COMPLEX_UNIT_DIP,則乘以顯示密度density。
而如果是TypedValue.COMPLEX_UNIT_SP,則乘以像素密度scaledDensity。
我們繼續刨根追底
density和scaledDensity的差別在于
density:The logical density of the display.顯示密度density = dpi/160
scaledDensity:A scaling factor for fonts displayed on the display.顯示字型的縮放因子 = density
實際上兩者的值一樣,為了驗證這個結論我們随便找兩台機器小米2S和華為p7,取出density和scaledDensity是一緻的,P7為3.0,小米2S = 2.0
是以本文結論轉化dp-px,px-dp,sp-px,px-sp
使用下面方法:
如有錯誤,敬請指正。