先放結論:
前言:px有什麼問題?
Android屏幕適配由來已久,關鍵在於屏幕尺寸與屏幕解析度的變化巨大。在成千上百種機型面前,px單位已難以適應。
1.同樣尺寸,不同解析度:1080px的寬度上顯示100px 比例是100/1080720px的寬度上顯示100px 比例是100/7202.同解析度,不同尺寸:1080px在4.7寸上顯示100px 1080px在6.1寸上顯示100px
如果使用多套px文件方案來適配,市面上少說上百種寸,需要的文件太多了。
第一個問題:同樣尺寸但是不同解析度的屏幕該如何適配?
dp是什麼?
px:像素單位,1px代表1個像素
dpi:像素密度,單位英寸上的像素數量,公式是dpi=屏幕對角線像素總數px/屏幕對角線長度in
density:屏幕密度,規定以160dpi的屏幕其屏幕密度為1,反過來說就是屏幕密度為1的屏幕上1in上有160px
480 dpi/160 = 3320 dpi/160 = 2240 dpi/160 = 1.5160 dpi/160 = 1120 dpi/120 = 0.75dp:Android開發上的基於屏幕密度的一種密度無關的像素單位,1dp代表的像素長度=density * 1 px
480 dpi上 1dp = 1 * 3 = 3px320 dpi上 1dp = 1 * 2 = 2px240 dpi上 1dp = 1 * 1.5 = 1.5px160 dpi上 1dp = 1 * 1 = 1px120 dpi上 1dp = 1 * 0.75 = 0.75pxdp解決了什麼問題?
以上公式表示了,同樣尺寸上不同解析度(不同density)的設備,每1dp所代表的像素數量是不一樣的。
但是所表示的物理長度(160dp=1in)是一樣的。
160 dp在density=3上表示480px,物理長度為1 in160 dp在density=2上表示320px,物理長度為1 in160 dp在density=1.5上表示240px,物理長度為1 in160 dp在density=1上表示160px,物理長度為1 in160 dp在density=0.75上表示120px,物理長度為1 in至此,dp單位的使用就意味著你在這些同樣尺寸但是不同解析度的設備上看到的大小一樣,此時各設備上顯示的比例也就一致了。
dp沒有解決什麼問題?
同樣解析度(相同的density)但是尺寸不同的設備上,dp會顯示出什麼樣的效果呢?這裡要算一下每個設備上的總dp,以橫向舉例:
同樣是480 dpi的像素密度,但是尺寸不同的設備:density=3,1080px/(480dpi/160) = 360 dpdensity=3,720px/(480dpi/160) = 240 dp
同樣是320 dpi的像素密度,但是尺寸不同的設備:density=2,1080px/(320dpi/160) = 540 dpdensity=2,720px/(320dpi/160) = 360 dp
同樣是240 dpi的像素密度,但是尺寸不同的設備:density=1.5,1080px/(240dpi/160) = 720 dpdensity=1.5,720px/(240dpi/160) = 480 dp這種情形下面,有的大屏,有的小屏,各種屏幕的總dp不一樣,dp單位也無法完成適配了。啊哈?那這就跟px的弱點一樣的啊?沒錯就是醬紫~
在dp之上的補充方案
Android3.2之後提供了smallestWidth最小寬度限定符方案:
多套dp文件,文件仍然需要多套,但是比起px會少很多~
不需要與解析度完全匹配,可以找到差距最小的文件,比起px容錯率更高~
並且同時可以使用sp適配文字,比px好~
今日頭條方案
代碼中動態替換density大小~,不需要多套文件了~
所以首選這個方案!!!
Github連結:
https://github.com/JessYanCoding/AndroidAutoSize
理解了這些,再也不用苦惱了哈哈哈
Google對像素密度劃分區域
名稱
像素密度範圍
縮放倍數
ldpi
~120dpi
0.75
mdpi120dpi~160dpi1
hdpi160dpi~240dpi1.5
xhdpi240dpi~320dpi2
xxhdpi320dpi~480dpi3
xxxhdpi480dpi~640dpi4Google官網連結:
https://developer.android.google.cn/guide/practices/compatibility
PS:如果不小心碰到了非標準的方形像素的設備,那麼,呃…嗯看起來就會扁了