多說幾句:
之前由於沒有仔細研究適配,一直認為android不是有dpi么,只要保證mdpi等等的值設置好且正確就可以做到適配。但是在近期的項目中,需要適配平板和手機。計算了平板和手機,dpi都是屬於xhdpi的,但是效果展示相差很大。還再納悶,不是說dp可以自己根據屏幕大小調整適配么?經過查閱資料發現:在屏幕 尺寸相差不大的情況下,dp可以使不同分辨率的設備上展示效果相似。但是在屏幕尺寸相差比較大的情況下,dp就失去了這種效果。所以需要以下的限定符來約束,采用多套布局,數值等方式來適配。
寫的挺詳細的。原作者辛苦了。但是為了方便查閱。我把重要的表格摘錄出來了。有不明白的去查看原文。
在安卓3.2之下的適配 限定符
屏幕特性
限定符
描述
屏幕尺寸
small
小屏幕
normal
基准屏幕
large
大屏幕
xlarge
超大屏幕
屏幕密度
ldpi
<=120dpi
mdpi
<= 160dpi
hdpi
<= 240dpi
xhdpi
<= 320dpi
xxhdpi
<= 480dpi
xxhdpi
<= 640dpi(只用來存放icon)
nodpi
與屏幕密度無關的資源.系統不會針對屏幕密度對其中資源進行壓縮或者拉伸
tvdpi
介於mdpi與hdpi之間,特定針對213dpi,專門為電視准備的,手機應用開發不需要關心這個密度值.
屏幕方向
land
橫向
port
縱向
屏幕寬高比
long
比標准屏幕寬高比明顯的高或者寬的這樣屏幕
notlong
和標准屏幕配置一樣的屏幕寬高比
例如:
res/layout/my_layout.xml // layout for normal screen size ("default")
res/layout-large/my_layout.xml // layout for large screen size
res/layout-xlarge/my_layout.xml // layout for extra-large screen size
res/layout-xlarge-land/my_layout.xml // layout for extra-large in landscape orientation
res/drawable-mdpi/graphic.png // bitmap for medium-density
res/drawable-hdpi/graphic.png // bitmap for high-density
res/drawable-xhdpi/graphic.png // bitmap for extra-high-density
res/drawable-xxhdpi/graphic.png // bitmap for extra-extra-high-density
res/mipmap-mdpi/my_icon.png // launcher icon for medium-density
res/mipmap-hdpi/my_icon.png // launcher icon for high-density
res/mipmap-xhdpi/my_icon.png // launcher icon for extra-high-density
res/mipmap-xxhdpi/my_icon.png // launcher icon for extra-extra-high-density
res/mipmap-xxxhdpi/my_icon.png // launcher icon for extra-extra-extra-high-density
android3.2之后引入的,目前推薦使用的;
屏幕特性
限定符
描述
最小寬度限定符
swdp例如sw600dp, sw720dp
屏幕的最小尺寸,就是屏幕可用區域的最小尺寸,是指屏幕可用高度或寬度的最小值(你可以默認是屏幕的最小寬度).你能用這個限定符確保,無論屏幕方向如何,這個限定符修飾下的布局需要的屏幕最小尺寸是Ndp.例如,如果你的布局在運行時需要的最小屏幕寬度是600dp,則你可以利用這個限定符創建布局資源目錄res/layout-sw600dp.只有當屏幕的最小寬度或最小高度是600dp時,系統才會使用這些布局文件或者資源文件.最小屏幕寬度是固定設備的特有屏幕尺寸,當屏幕方向發生變化時,設備的最小寬度值不變.設備的最小寬度值要考慮屏幕的尺寸和系統UI.例如,如果在屏幕上有一些系統持久化UI元素,則系統的最小寬度值要比實現的屏幕尺寸小一些,因為這些系統的UI元素你的應用是無法使用到的.當你使用之前的廣義限定符是,你可以定義連續的一系列限定符.用最小寬度來決定廣義屏幕尺寸是有意義的,是因為寬度是影響你UI設計的關鍵因素.UI在豎直方向上會經常滾動,但是在水平方向上往往是固定的布局.可見不論是適配手機或者平板,寬度往往都是布局的關鍵因素.因此,你需要關心你手機上的最小寬度值.
屏幕可用寬度
wdpExamples:w720pw1024p
指定資源使用時需要的最小寬度.當屏幕方向發生變化時,系統會調整這個值,使其始終為你UI顯示的寬度.這個屬性經常被用來判斷當前是否需要顯示多屏布局,因為哪怕用戶當前正在使用平板,你也可能不希望用戶在平板豎屏時顯示多個屏幕的布局樣式.這時,你就可以使用這個限定符來標明你布局需要的最小寬度
屏幕可用高度
hdpExamples:h720dph1024dpetc.
標明資源使用時需要的最小高度.當屏幕發生旋轉時,系統會自動選擇當前大的一方作為高度值.大部分應用很少需要這個限定符,因此不做過多講解
在不考慮屏幕方向只關注布局最小空間的前提下,使用sw的方式更加簡單.
例如:
res/layout/main_activity.xml #手機布局
res/layout-sw600dp/main_activity.xml #7寸平板布局
res/layout-sw720dp/main_activity.xml #10寸平板布局
再補充一點:
設備寬度的dp計算方法:
dp = 屏幕像素寬度/(屏幕像素密度/160) 160是基准屏幕像素密度 這個用來計算以上的sw后面的數值
通用公式:
dp = px/(dpi/160)
px = dp*(dpi/160)