android中圖片適配是一件很棘手的事情,本篇文章詳細的介紹屏幕顯示的原理,爲何會資源文件中會存在android
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi等文件夾,爲何要使用dp做爲單位等等。web
首先從這兩張圖片的顯示效果開始提及api
這是一張200x200的圖片在不一樣的手機上的顯示效果。很明顯第二張圖片看上去要比第一張佔用的空間小不少?這是爲何呢?eclipse
這裏咱們引入 ppi (pixel per inch)名詞,翻譯過來就是每英寸的距離像素點的個數。如今來解釋上面的現象。對於一張200x200像素的圖片,我國咱們想要顯示在 200ppi 的手機上,那麼佔用屏幕的長和寬均爲 200pix / (200pix / inch) = 1 inch ,也就是說要佔用 1 inch x 1 inch,若是要顯示在 300ppi 的手機上,那麼佔用屏幕的長和寬均爲 200pix / (300pix / inch ) = 2/3 inch,也就是說對於 ppi越高的手機,單位inch上可以顯示更多的像素點,所以當這兩種手機顯示一樣多的像素點的時候,ppi 越高的手機佔用的空間就越小。這就是咱們想要圖片在各類手機屏幕上都顯示一致的效果時須要解決的問題。佈局
既然這種效果不是咱們想要的,怎麼作才能獲取一致的顯示效果呢?下面介紹三種方法url
方法一:對每一中不一樣的ppi使用不一樣的圖片,這須要咱們先判斷屏幕的ppi,再對圖片進行處理,而後顯示,顯然比較麻煩。並且對於獲取屏幕ppi這個參數android並無提供給咱們api調用。因此這種辦法基本行不通spa
方法二: 在用eclipse開發環境生成一個android項目後,系統會給咱們生成drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi,drawable-xxhdpi,對於同一張圖片資源,咱們分別建立這五個版原本適應不一樣的屏幕。假設你想一張圖片翻譯
在 200ppi和400ppi的手機上顯示的長和寬都是同樣的爲 1inch x 1inch,那麼你就須要製做一張200x200的圖片和一張orm
400x400的圖片,而後放入對應得drawable目錄中就能夠了。那麼程序運行時怎麼知道本身究竟是使用哪一個drawable目錄下圖片
的圖片呢?這個是不須要咱們考慮的,而是手機廠商考慮的問題,只須要知道,程序會使用適應當前屏幕的目錄下的圖片
資源。
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi,drawable-xxhdpi,這幾個目錄對應的pppi爲
120ppi 160ppi 240ppi 320ppi 480ppi ,也就是說若是屏幕的ppi爲320,那麼就會優先使用drawable-xhdpi目錄下的
圖片資源。固然手機屏幕的ppi也是多種多樣,例若有的是 300ppi,有的是220ppi,這個系統會選擇最接近的目錄,也就
是 300ppi的手機會選擇320ppi對應的drawable目錄下的資源
方法三:方法2中須要爲每一個drawable目錄都生成對應的圖片版本,若是圖片較多的話,生成不一樣版本的圖片卻是小事更主要的缺點是會增大應用的大小,那麼可不能夠只在一個目錄下存放圖片,例如只在drawable-mdpi目錄下存放圖片呢答案是能夠的,假設咱們在drawable-hdpi(對應的ppi爲160ppi)目錄下存放了一個100X100的圖片,那麼當圖片須要
在320ppi的android設備上進行顯示時,android系統會將自動將圖片進行處理生成一個200X200的圖片顯示到設備上,那麼他們佔用的空間大小分別爲 100/160 = 3/5 inch 200/320 = 3/5 inch 能夠看出他們佔用的長和寬都是同樣的這種自動縮放的優勢是隻須要一張圖片就能適應各類ppi類型的屏幕。缺點是當對100X100的圖片進行變換成200X200的圖片時肯能會形成圖片的不清晰,若是提供一個drawable-xhdpi下的圖片資源,圖片較多的話會無形增長應用的大小,因此說如何進行選擇也是一個衡量。建議是將比較重要的圖片資源提供多個版本(當android設備和本身的ppi相對應的drawable下找到想要的資源時,就不會再到其餘目錄需找資源)。不是很重要的圖片資源存儲一個版本,讓系統根據本身的ppi本身對圖片進行適當的縮放顯示。
最後再說下爲何在佈局文件中使用 dp做爲單位而不是使用px
dp是一個與屏幕ppi無關的參數,同時也是一個事實上並不存在的虛擬單位。顯示時會根據具體屏幕的ppi進行像素的映射,關係以下160ppi 1dp 1px120ppi 1dp 0.75px240ppi 1dp 1.5px320ppi 1dp 2px所以在佈局文件中通常使用dp做爲單位,這樣就能適應不一樣ppi的屏幕,在各類ppi的屏幕上有同樣大的物理上的距離。(能夠看出1dp並不老是等於1px的,對於ppi高的屏幕肯能要等於2px,只是爲了物理上看起來的距離是相等的)
最後但願你們可以明白 咱們常常說的分辨率和ppi的關係,其實他們是沒多大關係。分辨率只是說明屏幕上有多少個像素點,這也跟屏幕大小有關係。固然對於屏幕大小相同的來說 分辨率越高 ppi越大,若是脫離了屏幕的物理尺寸談分辨率是沒有任何意義的。就像平板的分辨率比手機的大,那是由於平板個大呀。從顏色顯示的細膩程度上講並不見得比手機強。