天天看點

Android适配不同分辨率——精确适配不同的dpi和螢幕尺寸

一、引言

  Android的開源使廠商無需自行研發OS,大大降低了研發、生産的成本,使得Android平闆品牌如雨後春筍般爆發,山寨機廠商們似乎又找到了一絲希望。與此同時帶來的是廣大開發者的苦不堪言,各種神奇的小闆兒考驗着app的相容性,各種定制的rom不經意間就讓app崩潰,光是界面上的調整就已經夠你喝一壺了,是不?

二、适配可行性

  早在Android設計之初就考慮到了這一點,為了讓app适應标準or山寨螢幕,google已經有一套成熟的解決方案。其中,有這麼幾個名額需要注意:

  (1)螢幕尺寸:機關inch,指的是螢幕對角線長度。

  (2)螢幕密度:機關dpi,指的是每inch上可以顯示多少像素點即px。

  (3)螢幕分辨率:機關px * px,指的是一屏顯示多少像素點。

  (4)螢幕無關像素:機關dp/dip,指的是自适應螢幕密度的像素,用于指定控件寬高。

  (5)刻度無關像素:機關sp,指的是自适應字型的像素,用于指定文字大小。

  以我自己的Haier W910超級戰艦(寬高比16:9)為例,上述機關的換算如下:

  已知資料:螢幕尺寸4.5, 分辨率1280 * 720, 螢幕密度320

  (1)16:9的4.5寸螢幕由勾股定理計算其高約為3.9寸,寬約為2.2寸

  (2)則豎向dpi為1280 / 3.9 ≈ 328, 橫向dpi為720 / 2.2 ≈ 327

  (3)工業上切割液晶闆時取整為320

   那麼既然dpi是自适應螢幕密度的,與px之間又是如何換算呢:

  120dpi(ldpi低密度屏)       1dp = 0.75px        (由于像素點是實體點,是以用2個像素點來顯示3個dp的内容)

  160dpi(mdpi中密度屏)     1dp = 1px

  213dpi(tvdpi電視密度屏)  1dp = 1.33px

  240dpi(hdpi高密度屏)      1dp = 1.5px

  320dpi(xhdpi極高密度屏)   1dp = 2px

  由上述分析結果可知,控件使用dp,文字使用sp即可滿足自适應的需求。

三、适配方案

  根據目前的調查,在市面上的平闆,基本上屬于mdpi和hdpi的,少數屬于tvdpi(如google出的nexus7),是以我們選擇這三種密度考慮适配;此外手機應用大多數都是豎屏使用,但平闆作為娛樂性的一款産品,橫豎屏均有使用的時候,是以我們還需要考慮到螢幕狀态進行适配;最後考慮到有的rom會将虛拟鍵計算到螢幕尺寸裡,還要考慮到虛拟鍵所占用的長寬。

  那麼如何根據這三個屬性來進行适配呢?Android在資源檔案values用檔案名的方式提供了限定符可以幫助我們判斷上述情況,限定符(mdpi,tvdpi,hdpi)可以幫助我們判斷螢幕密度,限定符(land,port)可以幫助我們區分螢幕橫豎屏狀态,而限定符(1024x600...)可以适配計算虛拟鍵或者不計算虛拟鍵的螢幕,限定符的詳細說明請參見Android SDK文檔中開發者指南的Supporting Multiple Screens話題。

  最終适配檔案夾如下圖所示:

  

Android适配不同分辨率——精确适配不同的dpi和螢幕尺寸

  注1:分辨率限定符的比對是向下比對,如果沒有values-land-mdpi-1024x552,比如,分辨率values-land-mdpi-1024x600的螢幕,當rom不把虛拟鍵計算到螢幕尺寸時,實際顯示的螢幕應該是values-land-mdpi-1024x552,無法适配到values-land-mdpi-1024x600,那這樣就可能适配到下一級,比如values-land-mdpi-800x480,但是現在的平闆已經沒有這麼低的分辨率了,是以是配到無限定符的values-mdpi裡,造成界面顯示上的瑕疵。

  注2:由于分辨率限定符的比對是向下比對,是以如果有非主流mdpi螢幕不能精确适配到上述指定值時,values-mdpi至少可以保證app運作時不至于崩潰,同理values可以保證ldpi螢幕的平闆不會因生成view而又取不到相應值而崩潰。

文章轉自: http://www.cnblogs.com/zealotrouge/archive/2012/11/23/2784774.html