天天看點

TypedValue.applyDimension 中dp和sp之間轉化的真相

   最近在看了許多關于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

使用下面方法:

如有錯誤,敬請指正。

繼續閱讀