android中圖片適配是一件很棘手的事情,本篇文章詳細的介紹螢幕顯示的原理,為什麼會資原始檔中會存在
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi等資料夾,為什麼要使用dp作為單位等等。
首先從這兩張圖片的顯示效果開始說起
-
這是一張200x200的圖片在不同的手機上的顯示效果。很明顯第二張圖片看上去要比第一張佔用的空間小很多?這是為什麼呢?
這裡我們引入 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 越高的手機佔用的空間就越小。這就是我們想要圖片在各種手機螢幕上都顯示一致的效果時需要解決的問題。
-
既然這種效果不是我們想要的,怎麼做才能獲取一致的顯示效果呢?下面介紹三種方法
方法一:對每一中不同的ppi使用不同的圖片,這需要我們先判斷螢幕的ppi,再對圖片進行處理,然後顯示,顯然比較麻煩。而且對於獲取螢幕ppi這個引數android並沒有提供給我們api呼叫。所以這種辦法基本行不通
方法二: 在用eclipse開發環境生成一個android專案後,系統會給我們生成drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi,drawable-xxhdpi,對於同一張圖片資源,我們分別建立這五個版本來適應不同的螢幕。假設你想一張圖片
在 200ppi和400ppi的手機上顯示的長和寬都是一樣的為 1inch x 1inch,那麼你就需要製作一張200x200的圖片和一張
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越大,如果脫離了螢幕的物理尺寸談解析度是沒有任何意義的。就像平板的解析度比手機的大,那是因為平板個大呀。從顏色顯示的細膩程度上講並不見得比手機強。
-