1.概念問題
- 屏幕分辨率 :指在手機屏幕上面的像素點數 比如1920*1080、1080*720
- 屏幕像素密度 (ppi):指每英寸上面的像素點的個數,單位是ppi,計算方式爲
(1280*1280 + 1920*1920)開方 / (x*x + y*y)開方
可根據上面的勾股定理計算 - 像素密度(dpi): 物理概念,是定死的,客觀存在的不會改變,是人爲定的值,比如幾部不同分辨率不同尺寸的ppi可能分別是430,440,450,那麼在Android系統中,可能dpi會全部被指定爲480
- 屏幕無關像素(dp/dip):Android的一個設計單位,是物理單位,跟屏幕像素密度無關,只不過跟像素存在換算關係,160dpi 是系統爲 mdpi 屏設定的基準密度,也就是說在mdpi的手機上,
1px = 1dp = 1英寸/160
,所以dp和px的換算關係爲:px = dp * dpi /160
,也就是說1dp的大小是固定的,但是在不同手機上1dp的物理長度包含的像素點個數不同,在160dpi的手機上1dp = 1px,其他手機分辨率越高,1dp包含的像素個數越多 - 對應關係
ldpi -> 120dpi 1dp = 0.75px
mdpi -> 160dpi 1dp = 1px
hdpi -> 240dpi 1dp = 1.5px
xhdpi -> 320dpi 1dp = 2px
xxhdpi -> 480dpi 1dp = 3px (目前這種是主流dpi)
xxxhdpi-> 640dpi 1dp = 4px (市場上很多手機已經是這種dpi了)
備註:假如自己算出來的ppi是443,那麼在Android系統中會向上取整,所以會認爲你的dpi是480,所屬的屏幕爲xxhdpi
2.屏幕適配問題
爲什麼會存在屏幕適配這個問題呢?舉個栗子,1080p的手機,大部分手機拿到的densityDpi=480,density=3,但是Google Pixel得到的卻是densityDpi=420,density=2.625,也就是說當你有一個View寬度寫爲了360dp那麼在大多數手機上是充滿全屏的,但在部分手機(比如上面的Pixel)卻顯示不了全屏,所以爲了能夠在所有手機上都顯示同樣的效果,就需要進行屏幕適配。
一般情況下,我們的頁面在高度這個維度上都是需要滑動的,而且大部分情況是不限制死高度的,所以我們需要做的是儘可能在寬度上保證所有手機一致,那麼我們就可以只在寬度上面進行適配。
那麼怎麼適配呢?假如UI出圖是基於1920px*1080px,那麼我們可以認爲總的寬度是360cp(cp是隨便寫的一個單位,意思是custom px),那麼可以得出1cp = 3px,這樣的話在720p的屏幕上按照比例就可以得到1cp = 2px,根據這個原理我們就可以窮舉市場上所有的屏幕尺寸按照寬度來適配,但是可能窮舉不全,所以需要給默認的, 在下面的目錄下面的xml文件配置<dimen name="cp">3px</dimen>
,配置項目中所需要的尺寸
values
values-mdpi
values-hdpi
values-xhdpi
values-xxhdpi
values-xxxhdpi
values-480*320
values-800*480
values-854*480
values-960*540
values-1024*600
values-1024*768
values-1184*720
values-1196*720
values-1280*720
values-1280*800
values-1812*1080
values-1920*1080
values-2560*1440
可以參考其他成熟方式,其中有一個今日頭條的適配方案其實跟本方案是一樣的,只不過他的寫法更簡單,進入頭條UI適配方案