多說幾句:
之前由于沒有仔細研究适配,一直認為android不是有dpi麼,隻要保證mdpi等等的值設定好且正确就可以做到适配。但是在近期的項目中,需要适配平闆和手機。計算了平闆和手機,dpi都是屬于xhdpi的,但是效果展示相差很大。還再納悶,不是說dp可以自己根據螢幕大小調整适配麼?經過查閱資料發現:在螢幕 尺寸相差不大的情況下,dp可以使不同分辨率的裝置上展示效果相似。但是在螢幕尺寸相差比較大的情況下,dp就失去了這種效果。是以需要以下的限定符來限制,采用多套布局,數值等方式來适配。
原文位址:http://blog.csdn.net/wzy_1988/article/details/52932875
寫的挺詳細的。原作者辛苦了。但是為了友善查閱。我把重要的表格摘錄出來了。有不明白的去檢視原文。
在安卓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之後引入的,目前推薦使用的;
螢幕特性 | 限定符 | 描述 |
---|---|---|
最小寬度限定符 | sw<N>dp 例如sw600dp, sw720dp | 螢幕的最小尺寸,就是螢幕可用區域的最小尺寸,是指螢幕可用高度或寬度的最小值(你可以預設是螢幕的最小寬度).你能用這個限定符確定,無論螢幕方向如何,這個限定符修飾下的布局需要的螢幕最小尺寸是Ndp. 例如,如果你的布局在運作時需要的最小螢幕寬度是600dp,則你可以利用這個限定符建立布局資源目錄res/layout-sw600dp.隻有當螢幕的最小寬度或最小高度是600dp時,系統才會使用這些布局檔案或者資源檔案.最小螢幕寬度是固定裝置的特有螢幕尺寸,當螢幕方向發生變化時,裝置的最小寬度值不變. 裝置的最小寬度值要考慮螢幕的尺寸和系統UI.例如,如果在螢幕上有一些系統持久化UI元素,則系統的最小寬度值要比實作的螢幕尺寸小一些,因為這些系統的UI元素你的應用是無法使用到的. 當你使用之前的廣義限定符是,你可以定義連續的一系列限定符.用最小寬度來決定廣義螢幕尺寸是有意義的,是因為寬度是影響你UI設計的關鍵因素.UI在豎直方向上會經常滾動,但是在水準方向上往往是固定的布局.可見不論是适配手機或者平闆,寬度往往都是布局的關鍵因素.是以,你需要關心你手機上的最小寬度值. |
螢幕可用寬度 | w<N>dp Examples: w720p w1024p | 指定資源使用時需要的最小寬度.當螢幕方向發生變化時,系統會調整這個值,使其始終為你UI顯示的寬度. 這個屬性經常被用來判斷目前是否需要顯示多屏布局,因為哪怕使用者目前正在使用平闆,你也可能不希望使用者在平闆豎屏時顯示多個螢幕的布局樣式.這時,你就可以使用這個限定符來标明你布局需要的最小寬度 |
螢幕可用高度 | h<N>dp Examples: h720dp h1024dp etc. | 标明資源使用時需要的最小高度.當螢幕發生旋轉時,系統會自動選擇目前大的一方作為高度值.大部分應用很少需要這個限定符,是以不做過多講解 |
在不考慮螢幕方向隻關注布局最小空間的前提下,使用sw<N>的方式更加簡單.
例如:
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)