作安卓的都知道,Android是不推薦咱們在佈局中直接使用px的,而是使用dp,那麼接下來咱們就先了解一下幾個概念: px:絕對像素 dp:設備獨立像素,也叫密度無關像素 sp:獨立比例像素 dpi:像素密度,假設每英寸有160個像素的話,那麼這個屏幕的dpi就是160,也就是在系統軟件上指定的單位尺寸的像素數量,它 每每是寫在系統出廠配置文件中的一個固定的值 ppi:也是像素密度,只是這個是物理上的概念,他是客觀存在的,不會改變。而dpi是參考了物理的像素密度以後,認爲的指定的一個值。這樣即可以保證在某一個區間的物理像素密度,在軟件上使用同一個值,這個值就是dpiandroid
咱們先記住幾個公式:佈局
1英寸 = 2.54cmspa
density = dpi / 160設計
px = dp * densitycode
px = dp(dpi/160)資源
在平常開發中咱們使用dp,再加上百分比,或者權重等,只能夠基本知足適配,要想還原設計稿,仍是要作別的工做,那麼下面咱們就 介紹下平常開發中經常使用的方式:開發
簡單點將就是窮舉市面上全部Android手機的寬高像素值 假設以320480爲基稿的話,那麼咱們把寬分紅320份,那麼每一份就是1,高同理,那麼x1 = 1,x2 = 2,y1 = 1,y2 = 2, 那麼在10801290的手機上咱們該怎麼作,320/1 = 1080/?,那麼 ?=3.375,那麼此時的x1 = 3.375,x2 = 6.75,高也是這樣計算,那麼,咱們將值對應的放在文件下面,即res/values-480320和res/values-19201080,get
注意it
1.這裏的文件的名字是高*寬
2.這裏使用的是px
3.必定要有一個默認的文件,即res/values,緣由以下:
使用該方式,是精確匹配,若是匹配不到的話,
那麼就會使用默認值,因此要給一個默認的文件,使用咱們經常使用的dp
複製代碼
smallestWidth,也叫sw限定符適配,指的是Android會識別屏幕的最小尺寸的dp值,而後根據識別到的結果去資源文件中 尋找對應的限定符的文件。這種方式跟上面的方式實際上是同樣的,可是容錯機制會比上面的好。 舉個例子:若是手機的dpi是480,橫向的像素是1080px,那麼根據上面的公式:px = dp(dpi/160),那麼此時的dp=360, 系統就會去尋找是否存在value-sw360dp的文件夾以及對應的資源文件,若是找不到value-sw360dp這個文件夾的話,會向下去找 最接近的文件夾,好比:value-sw350dpast
注意:
這裏計算時使用的是最小寬度,跟手機的高的像素值沒有關係
文件夾的命名不能出錯:使用value-sw360dp
這是使用的是dp
複製代碼
smallestWidth的適配機制由系統保證,咱們只須要針對這套規則生成對應的資源文件便可,不會出現什麼難以解決的問題,也根本不會影響咱們的業務邏輯代碼,並且只要咱們生成的資源文件分佈合理,,即便對應的smallestWidth值沒有找到徹底對應的資源文件,它也能向下兼容,尋找最接近的資源文件
原理:利用公式:px = dp * density,假設設計稿的寬度是360px,那麼咱們就會目標的值設置爲360dp,經過修改像素密度density的值 從而來保證這個值始終是360便可,這樣的話就能保證UI在不一樣的設備上表現一致了.
參考blankj大佬的文章: www.youtube.com/watch?v=ckZ…
缺點:因爲頭條的方案是直接修改 DisplayMetrics#density 的 dp 適配,這樣會致使系統 View 尺寸和原先不一致,好比 Dialog、Toast、 尺寸,一樣,三方 View 的大小也會和原先效果不一致。 有時會存在DisplayMetrics#density 被還原的狀況,須要本身從新設置回去,最顯著的就是界面中存在 WebView 的話會被還原
能夠參考下面blankj大佬的使用pt做爲適配單位的文章: blankj.com/2018/12/18/…