簡(jiǎn)介:很多剛開始接觸Android開發(fā)的初學(xué)者,雖然會(huì)做些簡(jiǎn)單布局,但是卻不明白其深層的意思,只是把布局文件寫完了,在真機(jī)上調(diào)試看到樣子就覺得完事了。也不會(huì)管這種布局方式是否在其他屏幕手機(jī)上合適。這篇文章先從一個(gè)最基本的小點(diǎn)入手,主要介紹下Android工程目錄下的mdpi、hdpi等目錄的意義,和它們與開發(fā)中所用到的一些基本單位如sp、dp等的關(guān)系。
在介紹開發(fā)上的知識(shí)之前
我們先了解下市面上一些手機(jī)規(guī)格里面所表達(dá)的意義。
以下用榮耀6 plus的屏幕參數(shù)作為例子講解這些參數(shù)之間的關(guān)系。

英寸(inch) 1 inch = 2.54 cm
主屏尺寸:也就是主要顯示屏幕對(duì)角線的距離
屏幕像素密度:ppi(pixels per inch ),意思是,每英寸所含有的像素?cái)?shù)量;
主屏分辨率:1920x1080像素表示屏幕高度上有1920個(gè)像素點(diǎn),寬度上有1080個(gè)像素點(diǎn);
以上三個(gè)參數(shù)是有一定關(guān)系的,
因?yàn)閷?duì)角線是5.5英寸,因像素相對(duì)于英寸足夠小,我們可以根據(jù)勾股定理,計(jì)算出對(duì)角線上大約有2202.907像素
再用這個(gè)像素?cái)?shù)除以5.5英寸大致得到像素密度為:400.528, 約等于401。所以此處屏幕像素密度為:401ppi
以上是市面上手機(jī)的一些參數(shù),而作為Android開發(fā)人員,則經(jīng)常會(huì)和以下幾個(gè)單位打交道:
px : one pixel (像素)
dip :Density-independent pixels(密度無關(guān)像素,也可以簡(jiǎn)寫成:dp,代表 1/160 inch,一般都會(huì)使用這個(gè)單位進(jìn)行布局)
sp :scale-independent pixels(拉升無關(guān)像素,與dp計(jì)算規(guī)則一致,區(qū)別是大小會(huì)根據(jù)系統(tǒng)設(shè)定而變,一般用在字體大小上)
還有兩個(gè) :一個(gè)是mm 表示毫米,另一個(gè)是pt表示點(diǎn) 1/72 inch,開發(fā)中不經(jīng)常用到,這里不做詳細(xì)介紹。
手機(jī)屏幕多種多樣,規(guī)格各不相同,Android為保證開發(fā)者能開發(fā)出適配不同屏幕的應(yīng)用,它把不同屏幕密度做了以下劃分;

注意這里的dpi 和ppi某種程度上來說其實(shí)是一樣的東西。每一種手機(jī)都有一個(gè)自己ppi,但我們?cè)诰幊虝r(shí),這個(gè)手機(jī)的屏幕就會(huì)對(duì)應(yīng)到我們所說的某個(gè)dpi,Android程序框架為了方便處理只定義了幾種dpi規(guī)格,某款手機(jī)在知道ppi后,向上找到最接近的dpi作為標(biāo)準(zhǔn)。如下一段代碼我們經(jīng)常用來打印設(shè)備密度,來進(jìn)行不同機(jī)型的屏幕適配。
Resources.getSystem().getDisplayMetrics().density
Resources.getSystem().getDisplayMetrics().densityDpi
在Nexus 6P中我們會(huì)得到density = 3.5,densityDpi = 560,而上網(wǎng)查找Nexus6P手機(jī)我們可以知道它的PPI為515,所以它對(duì)應(yīng)到了xxxhdpi這個(gè)范圍上。3.5就是560 / 160所得。
注:其中mdpi也叫normal size,是第一款基于Android的手機(jī) HTC T-Mobile G1手機(jī)的分辨率大小,Android直到 1.6版本才可以支持不同分辨率的屏幕。
這里我們舉個(gè)例子說明,Android應(yīng)用在工作時(shí)如何展示和選擇素材:
如果我們開發(fā)時(shí),把一個(gè) 10x10 像素的圖片放到mdpi的素材目錄下,布局設(shè)置為wrap_content;則這個(gè)圖片會(huì)在手機(jī)上占用 (1/16 x 1/16) inch 的空間。這時(shí)候同樣的一張圖片如果運(yùn)行在不同ppi的手機(jī)上,則會(huì)不一樣,因?yàn)殡m然在手機(jī)上占用的屏幕尺寸一樣,但是這個(gè)尺寸所包含的像素?cái)?shù)量不一樣。在高ppi手機(jī)上這張圖片可能會(huì)有模糊;
同樣如果你把這個(gè)10x10像素的圖片放到了hdpi目錄下,則這個(gè)圖片就會(huì)占用:(1/24 x 1/24)inch的大小,同樣的圖片則顯示的就會(huì)更小,也會(huì)更精致。因?yàn)樵谕瑯拥某叽缦掳烁嗟南袼亍?/p>
這樣你就可以根據(jù)需要適配機(jī)型的物理長(zhǎng)寬尺寸,來選擇把不同的素材放到不同的文件夾里,以達(dá)到最好的顯示;
那如果每個(gè)文件夾下都有這一張不同分辨率的圖片,應(yīng)用在運(yùn)行時(shí),Android系統(tǒng)會(huì)選擇最接近改密度的文件夾目錄下的素材,比如上面提到的榮耀 6 plus的401ppi,它向上接近480dpi,所以系統(tǒng)會(huì)優(yōu)先為它選擇xxhdpi目錄下的素材。