Android適配不同的dpi和屏幕尺寸

jopen 9年前發布 | 45K 次閱讀 Android Android開發 移動開發

一、引言

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而又取不到相應值而崩潰。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!