目錄
問題
今天在研究屏幕適配的一些細節性問題,自己折騰了折騰,也搜索了一些網上教程參考;
自己着手搞得過程中,發現這個smallestWidth 得這個數值是怎麼得來呢 ?
這幾天遇到得問題列表:
1. 小米手機系統上提供得尺寸信息(6.39 inch, 2340 x 1080 px, 403 ppi),和我代碼計算出來得不一樣, 估計我計算有問題;
2. 適配方式,一種是修改density 係數相關,一種是自動計算dimen-xxx, 直覺上感覺有點不大道至簡啊,沒有采用系統介入得方式;
公式
Ndp = smallestWidth * 160 / densityDpi
這個densityDpi 其實就是像素密度,既可以從代碼中獲取到,也可以通過如下命令直接獲取:
// 代碼
DisplayMetrics.densityDpi
// 命令
$ adb shell getprop ro.sf.lcd_density
此處,列舉一下別的以後可能會用到得公式:
// 公式一
px = density * dp
// 公式二
density = dpi / 160
// 公式三
px = dp * ( dpi / 160)
// 推導公式一
160 / dpi = dp / px
// 繼續,推導公式二
factor * 160 / dpi = factor * dp / px
當 factor == smallestWidth == sw 時,得
Ndp = sw * 160 / dpi = sw * dp / px = sw / density
由上述推斷過程,得出下述公式:
Ndp = sw / density
感覺有點不靠譜?
denysity: 密度無關像素
densityDpi: 像素密度,軟件像素密度
ppi: 像素密度,硬件像素密度兩者概念不一樣,請注意區分;
舉例
我用得小米9 手機當測試機,參考官網手機配置如下:
機型 | 分辨率 | ppi | inch | density | densityDpi(dpi) = ro.sf.lcd_density | smallestWidth | sw<N>dp | 備註 |
---|---|---|---|---|---|---|---|---|
小米9 | 2340x1080 px | 403 | 6.39 inch | 2.75 | 440 px/inch | 1080 px | Ndp = 1080 * 160 / 440 = 392.727 ~ 392 | Ndp = smallestWidth * 160 / densityDpi |
因此,計算約等於392,我得配置文件目錄爲:layout-sw392dp;
使用上述推導公式:
Ndp = sw / density = 1080 / 2.75 ~ 392
因此,此類計算得出,layout-sw392dp 兩種方式都爲正確;
參考
(完)