一些術語
Screen Size 螢幕尺寸:
實際的物理尺寸,以螢幕的對角線為準(包括通知欄?)
將所有的實際尺寸分為四個廣義的尺寸:small(小),normal(正常),large(大),extra large(特大)
Density 螢幕密度:
螢幕的屋裡面積內的像素數量,通常指dpi(DPI)
small的螢幕密度比normal或large在一個給定的物理面積內具有較少的像素
將所有實際密度分為四個廣義的密度:low(低),medium(中等),high(高),extra high(超高)
方向:
從使用者的角度來看,螢幕的方向是橫向或縱向,也就是螢幕的比例是高或者寬。
Resolution 解析度:
在螢幕上的像素總數。在支援多個螢幕時,應用程式不直接與解析度相關,應用程式應該只與螢幕大小和密度相關。
DP(密度無關的像素) Density-independent pixel:
在定義UI布局時應該使用的虛擬像素單元,它用一種密度無關的方式來表達布局尺寸或位置。
Aspect ratio 螢幕長寬比
長寬比是螢幕的物理寬度與物理高度的比例關係。應用程式可以通過使用限定的資源來為指定的長寬比提供螢幕布局資源。
設計和編碼
視覺在根據互動原型進行設計的時候,可以考慮以mdpi,也就是320x480為藍本進行設計,因為Android一般採用dp為單位,而我們設計的時候一般是px為單位的,這個就涉及到一個單位轉換的問題,而在mdpi下,px和dp是1:1的關係,這樣在標註座標的時候能夠很方便的進行單位轉換,例如我們以320x480為藍本的話,在photoshop測量的間距為10px,我們在給到RD時的座標可以直接標註為10dp;因為dp的單位是可以程式自己去適配不用dpi螢幕的,所以就算設計三套不同dpi的圖,一般也只用對mdpi的設計圖進行座標定位,這個座標的標註可以用在所有dpi的資源上
Android資源檔
drawable-hdpi裡面存放高解析度的圖片,如WVGA (480x800),FWVGA (480x854)
drawable-mdpi裡面存放中等解析度的圖片,如HVGA (320x480)
drawable-ldpi裡面存放低解析度的圖片,如QVGA (240x320)
Android上常見度量單位
px(像素):螢幕上的點,絕對長度,與硬體相關。
in(英寸):長度單位。
mm(毫米):長度單位。
pt(磅):1/72英寸,point。
dp(與密度無關的像素):一種基於螢幕密度的抽象單位。在每英寸160點的顯示器上,1dp = 1px。
dip:Density-independent pixel,同dp相同。
sp:在dp的基礎上,還與比例無關,個人理解為是一個向量圖形單位。
在xml中定義大小,建議TextView使用sp,其他使用dp
對應關係
Android手機螢幕標準 對應表徵圖尺寸標準 螢幕密度
xhdpi 1280*720 96*96 320
hdpi 480*800 72*72 240
mdpi 480*320 48*48 160
ldpi 320*240 36*36 120
以480dip*800dip的WVGA(density=240)為例,詳細列出不同density下螢幕解析度資訊:
當density=120時 螢幕實際解析度為240px*400px (兩個點對應一個解析度)
狀態列和標題列高各19px或者25dip
橫屏是螢幕寬度400px 或者800dip,工作區域高度211px或者480dip
豎屏時螢幕寬度240px或者480dip,工作區域高度381px或者775dip
density=160時 螢幕實際解析度為320px*533px (3個點對應兩個解析度)
狀態列和標題列高個25px或者25dip
橫屏是螢幕寬度533px 或者800dip,工作區域高度295px或者480dip
豎屏時螢幕寬度320px或者480dip,工作區域高度508px或者775dip
density=240時 螢幕實際解析度為480px*800px (一個點對於一個解析度)
狀態列和標題列高個38px或者25dip
橫屏是螢幕寬度800px 或者800dip,工作區域高度442px或者480dip
豎屏時螢幕寬度480px或者480dip,工作區域高度762px或者775dip
模擬器上不同解析度所有對應的資訊:
QVGA : {density=0.75, width=240, height=320, scaledDensity=0.75, xdpi=120.0, ydpi=120.0}
HVGA : {density=1.0, width=320, height=480, scaledDensity=1.0, xdpi=160.0, ydpi=160.0}
WVGA : {density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=240.0, ydpi=240.0}
其中,density為顯示的邏輯解析度;width及height就為螢幕解析度(為絕對寬度與高度),與fields中的widthPixels及 heightPixels一致;scaleDensity與density一致;xdpi及ydpi為x方向與y方向的像素密度。
如何計算密度(dpi)
1.標準是240*320畫在1.5*2平方inch上。那麼像每平方英寸有240*320/(1.5*2)=25600點,也就是一平方英寸的像素點為25600,所以dpi取為它的平方根160;如果你的dpi是120,那麼它的密度就是0.75.
2. 密度不只是與width有關,還與height有關,所以不管width是1.8還是1.3,它的密度都有可能是1;比如width是1.8,只要它的 height是3/1.8的話,如果pixel為240*320的話,它的密度仍舊是1;同樣如果width為1.3,只要它的 height為3/1.3的話,像素點為240*320,則密度也是1.
3.320*480/(1.5*2)得到單位平方英寸的點為51200,所以單位平方英寸是240*320畫在1.5*2螢幕的2倍。但是這是平方英寸啊,算密度的時候要開平方的啊,所以應該是2開平方,是1.414吧,大緻密度為1.5。
px與dip的關係
Android中,在160dpi (mdpi)中, 1 dip= 1 px;
以此類推,在120dpi(ldpi)中, 1 dip = 0.75px;
在240dpi (hdpi)中, 1 dip = 1.5px;
在320dpi(xhdpi)中, 1dip = 2px;
如何做到與密度無關
如果螢幕密度為160,這時dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作單位,如果螢幕大小不變(假設還是3.2寸),而屏 幕密度變成了320。那麼原來TextView的寬度設成160px,在密度為320的3.2 寸螢幕裡看要比在密度為160的3.2寸螢幕上看短了一半。但如果設定成160dp或160sp的話。系統會自動將width屬性值設定成320px的。 也就是160 * 320 / 160。其中320 / 160可稱為密度比例因素。也就是說,如果使用dp和sp,系統會根據螢幕密度的變化自動進行轉換。官方文檔總結的計算公式為:pixels
= dps * (density /160).
使用dip作為View的單位,這樣就可以同時相容各種不同的解析度,不會造成UI的不可相容。
螢幕支援範圍(不太明白)
從Android 1.6(API Level 4)開始,Android提供了對多個螢幕尺寸和密度的支援,以反映出裝置可能有的不同的螢幕配置。可以使用Android系統的功能,為每個螢幕配置最佳化應用程式的使用者介面,從而確保應用程式為每個螢幕提供正常並且儘可能最佳的使用者體驗。
為了簡化為多種螢幕設計使用者介面,Android劃分了實際的螢幕尺寸和密度範圍:
·廣義的尺寸大小集合: small(小), normal(正常), large(大), and xlarge(超大)
注:從Android 3.2(API Level 13)開始,這種尺寸集合被廢棄,取而代之的是一種基於可用螢幕寬度來管理螢幕尺寸的新技術。所以針對Android 3.2以及以上版本的開發,可以參考 為Android
3.2設計平板布局來擷取更多資訊。
·廣義的密度集合: ldpi (低), mdpi (中), hdpi (高), and xhdpi (超高)
廣義的大小和密度都圍繞一個基準配置,即正常的大小和MDPI(中)密度。這個基準配置即第一款Android裝置的配置,此裝置即擁有一個HVGA螢幕的T-Mobile G1(直到Android 1.6,這是Android支援的唯一的螢幕配置)。
每個廣義的大小和密度跨越了一系列實際的螢幕尺寸和密度。例如,兩個裝置,這兩個裝置報告的正常螢幕尺寸和寬高比可能與手工測量時略有不同。同樣,兩個裝置報告的hdpi的螢幕密度可能與真正的像素密度略有不同。 Android抽象了應用程式的這些差異,因此可以提供廣義的大小和密度設計的使用者介面,讓系統需要處理任何最終的調整。圖1顯示了不同的大小和密度大致分類成不同的大小和密度組。
圖1. 解釋了Android對實際的尺寸和密度到廣義的尺寸和密度(數字是不準確的)的大致映射。
每一個UI設計需要一個最小的空間,每一個上文提到的廣義的螢幕大小都擁有一個由系統定義的最小解析度。這些空間是以“dp”為單位的,當定義布局時,也應當使用相同的單位,它使系統避免了對螢幕密度變化的顧慮。
· xlarge 螢幕至少 960dp x 720dp
· large 螢幕至少 640dp x 480dp
· normal 螢幕至少 470dp x 320dp
· small 螢幕至少 426dp x 320dp
為不同螢幕尺寸和密度最佳化應用程式的使用者介面,可以提供任何廣義的大小和密度的alternative
resources(選擇性資源)。通常情況下,應該為不同的螢幕尺寸提供alternative layouts並且為不同的螢幕密度提供alternativebitmap images。在運行時,系統基於當前裝置的廣義螢幕尺寸或密度為應用程式採用適當的資源,
不需要為每一個螢幕大小和密度的組合提供選擇性資源。系統提供了強大的相容特性,可以處理在任何裝置的螢幕上呈現應用程式的大部分工作,開發人員只要實現UI技術,允許它正常調整。
注: 定義廣義屏裝置的大小和密度的特點是相互獨立的。例如,WVGA的高密度的螢幕被認為是一個正常大小的螢幕,因為它的物理尺寸是相同的T-MobileG1(Android的裝置和基準的螢幕配置)。另一方面,WVGA的螢幕中密度被認為是一個大尺寸螢幕。雖然它提供了相同的解析度(像素數相同),WVGA的螢幕中密度較低的螢幕密度,這意味著每個像素的物理面積較大,因此,整個螢幕是比基準(正常大小)的螢幕更大。
預設的控制項大小
當在螢幕為160dpi,也就是density為1的情況下,所得到的控制項的寬度和高度為android控制項的預設的dip大小。
比如:Button 的 預設高度為 48dip。
狀態列的預設高度為25dip。
Android螢幕自適應
一:建立不同的layout檔案
在res目錄下建立不同的layout檔案夾,比如layout-640x360,layout-800x480,所有的layout檔案在編譯之後都會寫入R.java裡,而系統會根據螢幕的大小自己選擇合適的layout進行使用。
二:針對不同螢幕製作不同大小的表徵圖
註:解析度與螢幕大小沒有關係,螢幕大小是物理外觀,而解析度則是顯示能力。
參考http://blog.csdn.net/liguangzhenghi/article/details/7244271
http://www.oschina.net/question/234345_40079
http://uoloveruo.blog.163.com/blog/static/283311422011102304132611/
http://blog.csdn.net/xixinyan/article/details/7316313
http://download.csdn.net/detail/welovesunflower/4540688
http://www.360doc.com/content/12/0301/17/5087210_190881395.shtml