為解決Android裝置片段化,引入一個概念density,也就是密度.它指的是在一定尺寸的物理螢幕上顯示像素的數量,一般使用dpi(dots per inch,每英吋像素數)作為單
位.比如裝置解析度為240x320,螢幕物理尺寸為1.5英寸x2英寸(對角線為2.5)它的密度可以用解析度/尺寸表示:240/1.5或者即320/2,密度為160dpi。算對角線也是一樣
的,長的平方+寬的平方=160000,開方後=400.可知400/2.5=160.對於使用者來說,密度越大的螢幕顯示效果越精細,因為每英寸顯示的像素數量更多。
以上的描述就是一個藍本(此藍本對應於mdpi).
按照此藍本一個dp相當於160dpi螢幕中的一個px.同理在,在320dpi的螢幕中,一個dp相當於2個px.
通過這樣的成比例放縮,Android解決了需要多個不同螢幕中的大小顯示問題.
所以在Eclipse的布局檔案中,以3.7in WVGA(Nexus One)(480x800)為例,可以看見其為sw320dp,h533dp.
即寬有320dp,高為533dp.
是怎麼計算出來的呢?
將(480的平方+800的平方)開方=932.9523031
然後932.9523031/螢幕尺寸3.7=252.14927,此結果為此手機的螢幕密度.
然後按照上面的藍本,就應該要計算在該手機上1dp對於多少px.計算如下:
160 1dp=1px
252.14927 1dp=?px
結果為:
252.14927/160=1.5759329
注意:
在此一般不取1.5759329,只取到1.5即可.
所以:480/1.5=320;800/1.5=533.3333(通常取為533),即上述的sw320dp,h533dp.
手機螢幕密度的對應關係
120上下浮動的都屬於ldpi
160上下浮動的都屬於mdpi
240上下浮動的都屬於hdpi
320上下浮動的都屬於xdpi
以摩托羅拉ME525+(3.7英寸 解析度854x480像素)為例:
將(480的平方+854的平方)開方=979.6509
然後979.6509/螢幕尺寸3.7=264.770529,此結果為此手機的螢幕密度.對應為hdpi
264.770529/160=1.6548
即在此手機中1dp=1.6548個像素,只取到1.6即可
所以:480/1.6=300;854/1.6=533.75(通常取為533)
按照這個邏輯,算出來的寬應該是只有300dp.悲劇的是,如果某個控制項的寬為300,在此手機上是不能鋪滿手機的寬的.
也就是說除以的不是1.6而還是1.5!!!!所以將寬設定為320即可
總結:在hdpi中,像素轉換為dp統一用的是:像素/1.5
以聯想K860(5.0英寸,解析度1280x720像素)為例:
將(1280的平方+720的平方)開方=1468.60478
然後1468.60478/螢幕尺寸5=293.720,此結果為此手機的螢幕密度.對應為xdpi
293.720/160=1.8357
即在此手機中1dp=1.8357個像素
所以:1280/1.8357=697.281;720/1.8357=392.22
按照這個邏輯,算出來的寬應該是392.22.悲劇的是,如果某個控制項的寬為392.22,在此手機上是顯示不完全的.
也就是說除以的不是1.8而是2!!!!所以將寬設定為360即可
總結:在xdpi中,像素轉換為dp統一用的是:像素/2
注意問題1:
在建立模擬器的時候注意
854x480在Hardware中,應該將Abstracted LCD density設定為240,並手動輸入解析度
1280x720在Hardware中,應該將Abstracted LCD density設定為320,並手動輸入解析度
注意問題2:
多個layout檔案夾在命名上有相應規則,以解析度480x854為例,需要建立480x854像素的layout檔案夾,命名:layout-854x480,有兩點需要注意:①大數(854)必須在前,
否則會報錯;②兩個數字之間的符號是小寫英文字母“x”,不是乘號