之前有做過一些項目,用到的螢幕适配就是洪洋推薦的,根據分辨率,生成多套xml檔案,不同分辨率對應不同xml布局,這樣大概能覆寫80%的主流螢幕,一旦找不到對應的分辨率就GG。我也想過一個解決方法,對找不到對應分辨率的螢幕就加入預設一套xml。
雖然能解決問題,但是生成的多套檔案總歸占了不少apk空間,後面摒棄這個方法。改用dp的方式做适配,發現同一dp在不同分辨率的表現還是有所差異,特地花時間了解dp,dpi,px,ppi這些概念,寫個blog記憶。
概念
- px
像素值,美工給出的設計圖以此為機關
- dp
即dip,像素無關密度,1dp表示在螢幕像素點密度為160ppi時1px長度
- dpi
)(dots per inch)螢幕密度,每英寸對應的像素點數 (ps:順便提到density,每平方英寸的像素點值
- ppi
(pixels per inch):也是螢幕密度,唯一不同的是每英寸對應的pixels,我粗略的認為和dpi等同(随時等大神指正,等到有人看再說:-D)
換算
如何用給的px畫圖并做适配才是最關鍵問題,那麼就涉及到機關的換算了。這裡我以nexus6為例。其參數可zol查:分辨率2560*1440,5.96英寸,493ppi。
-
ppi的計算
ppi=螢幕對角線上的像素點數/對角線長度 = √ (螢幕橫向像素點^2 + 螢幕縱向像素點^2)/對角線長度。
用nexus6參數計算 即: √(2560^2+1440^2)/5.96約等于493ppi。證明zol基本無誤
-
px和dp的換算
螢幕像素密度在android使用中是固定的。目前android像素密度有以下幾種:
密度 密度值(dpi) 分辨率 像素密度範圍(dpi) mdpi 160 320*480 120~160 hdpi 240 480*800 160~240 xhdpi 320 720*1080 240~320 xxhdpi 480 1080*1920 320~480 xxxhdpi 640 3840×2160 480~640 (ps:目前ldpi的手機基本沒有了,忽略)
前面談到ppi和dpi等同,nexus6是493ppi,但dpi是有固定的值和區間,按照表中對應,應該為xxxhdpi。
1dp=640/160=4px
引出一個公式
1dp=(螢幕ppi/ 160)px