基於android官方doc,力圖以較為簡潔的方式說明android多螢幕適配的相關技術。
螢幕尺寸(Screen size)
螢幕對角線的物理尺寸。android將所有螢幕尺寸分為四類:small、normal、large和extra large
螢幕密度(Screen density)
單位(螢幕)物理地區中像素的數量,通常使用dpi(dots per inch),即每英吋像素數來表達。
比如,單位地區內,低密度螢幕所含的像素數比高密度螢幕所含的像素數少。
android將螢幕密度分為四類:low、medium、high和extra high
方向(Orientation)
螢幕的方向,分為landscape和portrait兩種。
解析度(Resolution)
螢幕中物理像素總數。要支援多螢幕時,應用程式不直接與解析度打交道,只需關心螢幕尺寸和螢幕密度。
密度獨立像素(Density-independent pixel,簡寫為dp)
dp是一個虛擬像素單位,當定義UI布局時,應該使用dp,以螢幕密度無關的方式來定義布局。
一個dp等於160dpi螢幕上的一個像素。在運行時,基於螢幕密度,系統自動對dp描述的尺寸進行縮放。
dp與px的換算關係:px = dp*(dpi/160)。例如,在240dpi的螢幕上,1dp=1.5px
----------------------------------------
螢幕密度的計算公式 = ((解析度長^2 + 解析度寬^2)^(1/2))/螢幕尺寸
也就是根據解析度的長寬計算出對角線的像素數(利用勾股定理),再用對角線像素數除以對角線長度(即螢幕尺寸)
可以參考android應用 DPI Calculator
下面以幾個真實機器來加深一下相關概念的認知
| |
三星i5801 |
HTC wildfire S(g13) |
HTC sensation(g14) |
meizu m9 |
| 解析度 |
240*400 |
320*480 |
540*960 |
640*960 |
| 螢幕尺寸 |
3.2英寸 |
3.2英寸 |
4.3英寸 |
3.5英寸 |
| 螢幕密度 |
145.77 |
180.27 |
256.15 |
329.65 |
| DisplayMetrics得出的DPI |
120 |
160 |
240 |
320 |
黃色部分為使用上述公式計算的螢幕密度,綠色部分為使用DisplayMetrics得出的dpi,可以看到比較接近
有兩方面的原因,導致這兩個資料不一致
1.廠商給出的螢幕尺寸參數不是太精確
2.DisplayMetrics中定義的密度值只有120、160、213、240、320
----------------------------------------
這裡從另一個角度可以進行螢幕尺寸的反推,以meizu m9為例,通過DisplayMetrics可以得到其xdpi和ydpi均為325.12
這樣螢幕寬度=640/325.12=1.9685英寸,螢幕高度=960/325.12=2.9527英寸
使用勾股定理計算得出,對角線尺寸為3.5487英寸
這裡有一點存疑,HTC wildfire s(g13)的xdpi=159.37254,ydpi=160.42105,通過上述方式推算出其螢幕尺寸為3.6英寸,與實際手機的螢幕尺寸不符。其他機型則沒有出現計算結果與實際尺寸不符的現象!?
----------------------------------------
好,既然dp是android推薦在布局時使用的單位,並且在布局中以dp為單位指定了高度和寬度,那麼為什麼會出現的情況呢?
在http://developer.android.com/reference/android/util/DisplayMetrics.html中,描述density時有這樣一段話
The logical density of the display. This is a scaling factor for the Density Independent Pixel unit, where one DIP is one pixel on an approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), providing
the baseline of the system's display. Thus on a 160dpi screen this density value will be 1; on a 120 dpi screen it would be .75; etc.
This value does not exactly follow the real screen size (as given by xdpi andydpi,
but rather is used to scale the size of the overall UI in steps based on gross changes in the display dpi.For example, a 240x320 screen will have a density of 1 even if its width is 1.8", 1.3", etc.
也就是說,在240*320解析度的螢幕上,1.5"x2"、1.8"x2"和1.3"x2"這三種螢幕的density都是1。螢幕尺寸不同,像素數相同,那麼像素的大小必然不同,如果指定一個固定的dp值,那麼其對應的高寬值必然不同了。但是android能夠最大限度的保證,使用dp為單位的布局,其差距不會太大(對android硬體廠商令人眼花繚亂的螢幕尺寸種類,做到這一步,已經很不易了)。