既然這種效果不是我們想要的,那麽如何才能得到壹致的顯示效果呢?這裏有三種方法。
方法壹:每個屏幕不同的ppi使用不同的圖片,這就需要我們先判斷屏幕的ppi,然後再對圖片進行處理並顯示出來,顯然比較麻煩。而且android並沒有為我們提供獲取屏幕ppi參數的api調用。所以這個方法基本行不通。
方法二:用eclipse開發環境生成壹個android項目後,系統會為我們生成drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi。對於同壹個圖片資源,我們會創建這五個版本來適應不同的屏幕。假設妳想要壹張照片。
200ppi和400ppi手機上顯示的長寬是壹樣的,都是1英寸x 1英寸,所以妳需要做壹張200x200的圖和壹張圖片。
400x400的圖片,然後放在對應的drawable目錄下。那麽程序在運行時是如何知道它正在使用哪個可繪制目錄的呢?
照片在哪裏?這是我們不需要考慮的,是手機廠商需要考慮的。只知道程序會使用適應當前屏幕的目錄中的圖片。
資源。
Drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi,drawable-xxhdpi,這些目錄對應的pppi是
120 ppi 160 PPI 240 PPI 320 PPI 480 PPI,也就是說,如果屏幕的PPI是320,那麽就先用drawable-xhdpi目錄中的那個。
圖片資源。當然,手機屏幕的ppi也是五花八門,比如300ppi,220ppi。該系統將選擇最近的目錄,即,
300ppi的手機會選擇320ppi對應的drawable目錄中的資源。
方法三:方法二中,需要為每個可繪制目錄生成對應的圖片版本。如果圖片很多,生成不同版本的圖片是小事壹樁。主要缺點是它會增加應用程序的大小。那麽,可以只在壹個目錄下存儲圖片嗎,比如,在drawable-mdpi目錄下?答案是肯定的,假設我們在drawable-hdpi目錄下存儲壹個(對應的ppi是160ppi)。
在320ppi的android設備上顯示時,android系統會自動對圖片進行處理,生成200X200的圖片在設備上顯示,所以它們占用的空間分別為100/160 = 3/5英寸200/320 = 3/5英寸。可以看出,它們占據的長度和寬度是壹樣的。這種自動縮放的優點是只需要壹張圖片。缺點是當100X100的畫面轉換成200X200的畫面時,會造成畫面不清晰。如果提供壹個drawable-xhdpi下的圖片資源,圖片多了應用的規模無形中就增大了,所以如何選擇也是壹個衡量。建議是提供多個版本的比較重要的圖片資源(當android設備在其ppi對應的drawable下找到想要的資源時,就不會去其他目錄找資源了)。不是很重要的圖片資源存儲壹個版本,讓系統根據自己的ppi縮放顯示圖片。
最後,為什麽在布局文件中使用dp作為單位而不是px?
Dp是壹個與屏幕ppi無關的參數,也是壹個實際不存在的虛擬單位。像素會根據顯示時具體屏幕的ppi進行映射,關系如下:160 PPI 1dp 1px 120 PPI 1dp 0.75 px 240 PPI。
1dp 1.5 px 320 ppi 1dp 2 px因此,布局文件中壹般以dp為單位,可以適應不同的ppi屏幕,在各種PPI屏幕上物理距離相同。(可見1dp並不總是等於1px。對於高ppi的屏幕,可能等於2px,只是為了讓距離物理上相等。)
最後,希望大家能理解我們經常說的分辨率和ppi的關系。其實他們關系不大。分辨率只顯示屏幕有多少像素,這也和屏幕大小有關。當然,同樣的屏幕尺寸,分辨率越高,ppi越大。離開屏幕的物理尺寸來談分辨率是沒有意義的。就像平板的分辨率比手機大壹樣,那是因為平板更大。在色彩顯示的精細程度上不壹定比手機好。