【Android】layout-swdp 問題

 

目錄

問題

公式

舉例

參考


 

問題

今天在研究屏幕適配的一些細節性問題,自己折騰了折騰,也搜索了一些網上教程參考;

自己着手搞得過程中,發現這個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 手機當測試機,參考官網手機配置如下:

小米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 兩種方式都爲正確;

 

參考

  1. 限定符優先級
  2. 創建備用佈局;

 

 

 

 

(完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章