Android 屏幕適配教程、適配機制介紹

WTQAzucena 7年前發布 | 15K 次閱讀 安卓開發 Android開發 移動開發

概述

android屏幕適配有很多方面,例如,drawable,values等,開發者根據產品的實際情況和自己的經驗,可以選擇性的從其中幾個方面入手。

本文主要介紹一種基于分辨率等比例縮放的適配方案。

幾個必須知道的概念

屏幕尺寸

屏幕尺寸是指手機屏幕對角線的英寸數。

屏幕分辨率

屏幕分辨率是指屏幕寬高像素數。

屏幕密度

屏幕密度是指手機屏幕對角線上單位英寸內的像素數。

代碼中用的尺寸單位(dp,dip,sp,px)

這些單位跟我們寫代碼才是最相關的。

  • dp即dip,規定,密度為160的屏幕上,1像素對應的尺寸為1dp。320密度的屏幕上,1像素對應0.5dp,以此類推。在密度為160的屏幕上,1英寸有160個像素,那么1px對應的尺寸 = 1/160英寸。所以說dp是個物理尺寸,跟像素無關。所以,100dp的尺寸在不同手機上顯示出來,物理尺寸看上去基本是一樣的。
  • SP 即 Scale-independent Pixel,即與縮放無關的抽象像素。sp和dp很類似但唯一的區別是,Android系統允許用戶自定義文字尺寸大小(小、正常、大、超大等等),當文字尺寸是“正常”時,1sp=1dp=0.00625英寸,而當文字尺寸是“大”或“超大”時,1sp>1dp=0.00625英寸
  • px,即像素,無需多說

Android適配機制

  1. drawable,在工程里可以在res目錄下創建一系列的帶后綴的drawable文件夾,例如drawable-hdpi,drawable-xhdpi等等。
    • drawable的適配機制是,系統會先到后綴與設備匹配的drawable目錄下找對應的圖片,當找不到的時候會去‘更高’一級的目錄去找,再找不到,繼續往高一級的找,再找不到就退而求其次去低一級的找,依次類推。

      例如,在密度為xxhdpi的手機上運行app,會去drawable-xxhdpi目錄下找圖片資源,找不到就去drawable-xxxhdpi找,如果沒有比drawable-xxxhdpi更高的,則再找不到就去drawable-xhdpi找,再找不到就去drawable-hdpi找,直到找到對應的圖片資源,當找到后,系統會按密度對圖片做縮放處理,然后再顯示到屏幕上,所以如果圖片放的目錄不對的話,有可能造成圖片模糊。

  2. layout目錄,layout目錄也是可以加后綴的,通常是帶分辨率后綴(當然也可以加其他后綴,詳見android官網,這里只討論常用的后綴),例如, layout-land-1024x720,layout-1280x720,layout-1920x1080等等。
    • layout目錄的適配機制是,從“高往低”找最接近的尺寸目錄,例如手機是1920x1080分辨率的,但是如果無此layout目錄那么便會低一級的layout-1280x720找布局(而不會去高一級的layout-2560x1440找),依次類推,直至找到layout不帶后綴的目錄為止,如果還沒有,就會報錯。
    • 所以考慮以下場景:
      • 原本我們的布局文件目錄只有layout一個,沒有其他帶后綴的layout目錄
      • 實際測試中發現的布局在960x540手機上有問題。
        那么有些人可能會想到加個layout-960x540目錄,然后在此目錄下做特殊處理。那么問題來了,加了這個目錄之后,layout目錄就有兩個,layout無后綴和layout-960x540。當在1920x1080手機上運行程序時,按照適配機制,系統會使用layout-960x540目錄下的布局文件,而我們當初的初衷是只希望layout-960x540目錄下的布局文件在960x540的手機上使用,所以這種情況下布局肯定會有問題。
        因此,千萬注意上面這種場景,不要隨意添加‘layout-分辨率’的這種目錄,除非把各種主流分辨率都添加一遍。碰到這種問題,最好從dimens文件入手做適配,后面會講到。
  3. values目錄之dimens文件,為了適配不同尺寸的手機,我們可以創建多個values目錄,然后在其中定義dimens尺寸,例如values-1280x720,values-1196x720等等。
    • dimens適配的機制是,先找跟設備對應的values目錄下的dimens文件中的尺寸定義,找不到則往低一級的找,比如,在1280x720分辨率的手機上,如果app中沒有創建values-1280x720目錄,而只有values-1920x1080、values-1196x720目錄和默認的values目錄,那么系統會去優先去values-1196x720的目錄下找對應的尺寸。如果找不到,則去默認的values找,再找不到就報錯(不會去1920x1080目錄找)。

      總結:

      1.drawable適配過程:找與設備密度對應的目錄下的圖片-》往更高質量的找-》退而求其次找低質量的

      2.layout適配過程:找與設備對應的目錄,找不到則從比設備分辨率低一級的目錄開始依次往下找。

      3.values適配過程:同layout。

基于分辨率等比例縮放的適配方案示例

先看兩張圖:

800x480分辨率.png

1920X1200分辨率.png

上面兩張圖中的登錄按鈕的尺寸是100dp,分別在800x480的設備上和1920x1200的設備上運行效果。可以看出來,第一張圖按鈕的尺寸跟整體布局還比較協調,但是第二張圖中的按鈕寬度顯得特別的小,與整體布局很不協調。(注意,兩個圖中的按鈕,在實際設備上的物理尺寸是差不多的,但是為了看起來方面,我將兩張圖都等比例壓縮了,但是,這樣不影響我們看按鈕與整體尺寸比例關系)。

在實際界面開發當中,一般流程是這樣的:

1.UI設計師基于854x480手機設計了一套圖,并給出了標注。

2.開發人員將標注轉換為dp寫到布局文件中。

3.在854x480分辨率的手機上測試界面效果,不出意外應該是跟設計圖基本一致的。

但是,如果將程序運行到1920x1080分辨率,但是密度為240(hdpi)的設備上,那就會出現類似上面第二張圖中的效果(當然實際開發中會把上圖中的按鈕的寬度設置為match_parent,這里只是為了說明問題)。

界面布局簡單了還好,我們可以通過調整,使用相對布局以及match_parent等手段將界面調整的比較好看。但是如果界面元素比較多了,有時候我們必須給某個控件設置一個固定尺寸,所以肯定避免不了這種問題的出現。

所以UI設計師可能會提出如下幾個要求:

1.設計師基于720P(1280x720)設計一套圖,并標注

2.研發開發出來的實際效果在720P手機上必須跟標注一致(要求高的公司甚至精確到像素)

3.如果在480P、1080p手機上,則實際尺寸按標注等比例縮放。比如在720p上的標注是100px,那么顯示到1080p手機上必須是100*1080/720 = 150px。

4.對于非標準分辨率來說,比如1184x720(手機底部帶虛擬按鍵的那種),則需要在高度上做調整,給控件的縱向間隙做些調整。

所以針對如上要求,結合android屏幕適配的機制,可以采用如下方案來適配:

  1. 創建不同分辨率的values文件夾,在其中分別創建dimens.xml:

不同目錄的dimens文件.png

  1. 由于我們的標注是基于1280x720分辨率標注的,所以在values-1280x720目錄下的dimens.xml里定義諸如下面這些尺寸:

values-1280x720.png

可以看到,我對名字的命名有一些規則,即,寬度值用‘w_像素數值’的格式命名,高度值用‘h_像素數值’的格式命名。

  1. 根據標注編寫布局文件,假設標注中‘發送驗證碼’按鈕的寬度為180px

    代碼片段.png

    在720分辨率手機上對應的效果:

    720p.png

    4.根據values-1280x720目錄下的dimens文件內容,轉換為其他分辨率下的尺寸,然后放到對應分辨率的values目錄下。當然這種轉換手動轉會累死。我寫了一個轉換工具(一個java類),轉換起來很方便。

好了。來看下效果, 重點關注‘發送驗證碼’按鈕 ,為了方便看這個按鈕占據整個布局的比例,我把幾張圖都縮放為差不多大小:

1.1280x720分辨率:

720p.png

2.1920x1080分辨率:

1080new.png

3.2560x1440:

2k_new.png

上面的方式就是按分辨率等比例縮放的適配方式,我們稱其為第一種適配方式,另外還有第二種適配方式,就是我們常用的把寬高用dp來定義的方式。

如果把‘發送驗證碼’按鈕的寬度使用dp來定義,按照180px的標注,那轉換為dp按鈕寬度應設置為90dp,那么效果如下:

1.720分辨率,密度320dpi,跟上面用px的效果一樣。

2.2560x1440分辨率,密度560dpi(由于用了dp,所以密度要關注下):

2k_usedp.png

可以看出按鈕的寬度占整個屏幕寬度的比變小了。分析下原因,按第一種方式,即寬度按像素設定的方式,app運行時,@dimen/w_180px在2560x1440分辨率的手機上會去找values-2560x1440目錄下的dimens文件,而此文件中的尺寸定義已經事先被我們按等比例縮放好了,即縮放后的像素= 180

1440/720 = 360px

560/160 = 315px。

那么按鈕寬度占屏幕寬度的比例315:1440小于360:1440所以,所以看起來占用比例小了。

總結下,如果要適配各種分辨率的手機,并且想讓控件在屏幕中所占用的比例不變,那么就需要用第一種方式來適配。這種方式下,無論屏幕的密度是多少,控件顯示出來后在屏幕中占用的比例都不會變。

也就是說,如果按這種方式做的話,由于主流分辨率的寬高比基本一致,因此在任何主流分辨率手機上運行后截圖,然后再縮放為720寬度,那么界面中的元素位置及大小一定是跟標注中一致的。

以上是對屏幕適配的一些理解,及實際測試過后的一些結論,希望對大家有幫助。

另外,尺寸轉換的工具見附件,用java swing組件做了個界面(比較low,湊合用吧):

尺寸轉換工具

使用說明:

Paste_Image.png

尺寸轉換工具使用.gif

 

來自:http://www.jianshu.com/p/a92530c9d0cd

 

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