簡介:很多剛開始接觸Android開發(fā)的初學(xué)者锈遥,雖然會做些簡單布局屈尼,但是卻不明白其深層的意思抒倚,只是把布局文件寫完了,在真機(jī)上調(diào)試看到樣子就覺得完事了判莉。也不會管這種布局方式是否在其他屏幕手機(jī)上合適豆挽。這篇文章先從一個(gè)最基本的小點(diǎn)入手,主要介紹下Android工程目錄下的mdpi券盅、hdpi等目錄的意義帮哈,和它們與開發(fā)中所用到的一些基本單位如sp、dp等的關(guān)系锰镀。
在介紹開發(fā)上的知識之前
我們先了解下市面上一些手機(jī)規(guī)格里面所表達(dá)的意義娘侍。
以下用榮耀6 plus的屏幕參數(shù)作為例子講解這些參數(shù)之間的關(guān)系。
英寸(inch) 1 inch = 2.54 cm
主屏尺寸:也就是主要顯示屏幕對角線的距離
屏幕像素密度:ppi(pixels per inch )泳炉,意思是憾筏,每英寸所含有的像素?cái)?shù)量;
主屏分辨率:1920x1080像素表示屏幕高度上有1920個(gè)像素點(diǎn)花鹅,寬度上有1080個(gè)像素點(diǎn)氧腰;
以上三個(gè)參數(shù)是有一定關(guān)系的,
因?yàn)閷蔷€是5.5英寸刨肃,因像素相對于英寸足夠小古拴,我們可以根據(jù)勾股定理,計(jì)算出對角線上大約有2202.907像素
再用這個(gè)像素?cái)?shù)除以5.5英寸大致得到像素密度為:400.528真友, 約等于401黄痪。所以此處屏幕像素密度為:401ppi
以上是市面上手機(jī)的一些參數(shù),而作為Android開發(fā)人員锻狗,則經(jīng)常會和以下幾個(gè)單位打交道:
px : one pixel (像素)
dip :Density-independent pixels(密度無關(guān)像素满力,也可以簡寫成:dp,代表 1/160 inch轻纪,一般都會使用這個(gè)單位進(jìn)行布局)
sp :scale-independent pixels(拉升無關(guān)像素,與dp計(jì)算規(guī)則一致叠纷,區(qū)別是大小會根據(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芹扭,但我們在編程時(shí),這個(gè)手機(jī)的屏幕就會對應(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中我們會得到density = 3.5
要尔,densityDpi = 560
舍杜,而上網(wǎng)查找Nexus6P手機(jī)我們可以知道它的PPI為515,所以它對應(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è)圖片會在手機(jī)上占用 (1/16 x 1/16) inch 的空間嚎幸。這時(shí)候同樣的一張圖片如果運(yùn)行在不同ppi的手機(jī)上颜矿,則會不一樣,因?yàn)殡m然在手機(jī)上占用的屏幕尺寸一樣嫉晶,但是這個(gè)尺寸所包含的像素?cái)?shù)量不一樣骑疆。在高ppi手機(jī)上這張圖片可能會有模糊;
同樣如果你把這個(gè)10x10像素的圖片放到了hdpi目錄下替废,則這個(gè)圖片就會占用:(1/24 x 1/24)inch的大小箍铭,同樣的圖片則顯示的就會更小,也會更精致椎镣。因?yàn)樵谕瑯拥某叽缦掳烁嗟南袼亍?/p>
這樣你就可以根據(jù)需要適配機(jī)型的物理長寬尺寸诈火,來選擇把不同的素材放到不同的文件夾里,以達(dá)到最好的顯示状答;
那如果每個(gè)文件夾下都有這一張不同分辨率的圖片冷守,應(yīng)用在運(yùn)行時(shí)刀崖,Android系統(tǒng)會選擇最接近改密度的文件夾目錄下的素材,比如上面提到的榮耀 6 plus的401ppi拍摇,它向上接近480dpi亮钦,所以系統(tǒng)會優(yōu)先為它選擇xxhdpi目錄下的素材。