天天看點

Android淺談螢幕适配方案

一、基礎概念了解

1、螢幕尺寸

     螢幕對角線的長度,機關英寸,1英寸=2.54cm

2、螢幕分辨率

     螢幕橫向和衆向像素點數  機關px   1px=1實體像素,現在一般以1920*1080為基準

3、螢幕像素密度dpi(Dots  Per  Inch)

     每英寸上的像素點數,機關dpi,與像素無關的機關;像素密度與螢幕尺寸,螢幕分辨率有直接的關系

     标準螢幕像素密度(mdpi) ,每英寸長度上有160個像素點(160dpi)

Android淺談螢幕适配方案

     像素密度是清晰度很重要的一個概念:即像素密度越高(dpi)代表顯示屏能夠以更高的密度顯示圖像。當然,顯示的密度越高,拟真度就越高,機關面積的像素數量就越多,是以細節就越豐富。

密度類型 分辨率(px) 螢幕像素密度(dpi) dp與px關系
mdpi 240*320 120dpi~~~160dpi 1dp=0.75px~1px
hdpi 320*480 160dpi~~~240dpi 1dp=1px~1.5px
xhdpi 480*800 240dpi~~~320dpi 1dp=1.5px~2px
xxhdpi 720*1280 320dpi~~~480dpi 1dp=2px~3px
xxxhdpi 1080*1920 480dpi~~~640dpi 1dp=3px~4px
Android淺談螢幕适配方案

density的擷取(DisplayMetrics類裡面的成員變量)

方式一
DisplayMetrics metrics=new DisplayMetrics();
Display defaultDisplay = getWindowManager().getDefaultDisplay();
defaultDisplay.getMetrics(metrics);

方式二
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();

方式三
DisplayMetrics displayMetrics1 = Resources.getSystem().getDisplayMetrics();
           

4、dp、dip(Device-Independent Pixel)

      裝置無關像素,因為它的大小不是一個實體值,而是由作業系統根據螢幕大小和密度動态渲染出來的。

二、螢幕适配問題的本質

1、布局适配         

2、布局元件适配

3、圖檔适配

4、代碼适配

Android淺談螢幕适配方案

三、布局适配

       布局适配是要使用多套布局來達到适配。如手機和平闆的适配就需要使用到布局适配。

1、尺寸限定符---Android3.2版本以前  

      res/layout_large/main.xml  

      在系統螢幕尺寸>7英寸時采用适配平闆的雙面闆布局,反之采用适配手機的單面闆布局

      還有:layout_small;layout_normal;layout_xlarge等

2、最小寬度限定符----Android3.2版本以後

        開發者首先在項目中根據主流螢幕的最小寬度(smallestWidth)生成一系列values-sw<N>dp檔案夾(含有dimens.xml檔案),當運作到裝置上時,系統會根據目前裝置螢幕的最小寬度去比對對應的values-sw<N>dp檔案夾,而對應的values-sw<N>dp檔案夾中的dimens.xml文字中的值時根據最小寬度而制定的,能夠适配,如果沒有找到對應的values-sw<N>dp檔案夾,則會去尋找與之最小寬度相近的values-sw<N>dp檔案夾,隻會找小于或等于目前裝置最小寬度的檔案夾。

        最小寬度的值=裝置寬高最小值/(dpi/160);

        如裝置螢幕資訊是1920*1080,480dpi,是以最小寬度=1080/(480/160)=360dp

3、布局别名(可以用在layout,也可以用在dimens上,主要看type屬性)

      當需要相容3.2版本以前的尺寸限定符和3.2版本以後的最小寬度限定符,那你得同時維護layout-sw600dp和layout-large檔案夾下的xml布局,是以使用布局别名很容易解決這個問題。

  1. 在layout檔案下建立main_onepanes,main_twopanes兩個布局檔案
  2. res/value-large/main.xml (Android 3.2版本以前)
<resources>
    <item name="main" type="layout">@layout/main_onepanes</item>
</resources>
           

       res/values-sw600dp/main.xml(Android 3.2版本之後的)

<resources>
    <item name="main" type="layout">@layout/main_twopanes</item>
</resources>
           

      3.使用

setContentView(R.layout.main);
           

4、螢幕方向限定符

     value-sw600dp-land   最小寬度600dp橫向       values-sw600dp-port最小寬度600dp縱向

     用在layout下,layout-sw600dp/main.xml,對于最小寬度>=600dp的裝置,系統會自動加載layout-sw600dp/main.xml雙面闆布局,否則系統就會選擇layout/main.xml手機布局。

四、布局元件适配

1、使用Relativelayout、Linearlayout,Constraatlayout不要使用絕對布局

2、使用match_parent、warp_content、layout_weight

3、百分比适配方法(以某一分辨率為基準,生成所有分辨率對應像素清單檔案)

     如:我們将以320*40的分辨率為基準,将螢幕的寬度分成320份,取值為x1~x320,将螢幕的高度分成480份,取值為y1~y480,

生成的檔案如下:lay_x.xml(寬)

Android淺談螢幕适配方案

 lay_y.xml(高)   

Android淺談螢幕适配方案

 有了基準之後,我們可以補全其他的尺寸如:1920*1080   1080/320=3.375px    1920/480=4px

Android淺談螢幕适配方案

最後,把這些檔案放到res檔案下:

Android淺談螢幕适配方案

     分辨率為480x320的資源檔案應放在res/values-480x320檔案夾中;同理分辨率1920x1080的資源檔案放在res/values-1920x1080檔案夾中,必須在預設的values裡面也建立對應預設lay_x.xml和lay_y.xml檔案。

使用方式:

<ViewStub
    android:id="@+id/tv"
    android:layout_width="@dimen/x160"
    android:layout_height="@dimen/y160" />
           

缺點:

  1. 由于實際上還是使用px作為長度的度量機關,是以和google的要求使用dp作為度量機關會有所背離
  2. 必須盡可能多的包含所有分辨率,因為這個是使用這個方案的基礎,如果有某個分辨率缺少,将無法完成該螢幕的适配
  3. 過多的分辨率像素描述xml檔案會增加軟體大小和維護難度。

4、頭條适配方案

      核心原理:  目前裝置螢幕總寬度(機關像素)/設計圖總寬度(機關為dp)=density

      density的意思就是1dp占用目前裝置多少像素。

       路徑:ttps://github.com/JessYanCoding/AndroidAutoSize

       侵入式少,可以随時更換,還可以自定義。

五、圖檔适配

1、logo多套圖

2、點9圖檔