一、基礎概念了解
1、螢幕尺寸
螢幕對角線的長度,機關英寸,1英寸=2.54cm
2、螢幕分辨率
螢幕橫向和衆向像素點數 機關px 1px=1實體像素,現在一般以1920*1080為基準
3、螢幕像素密度dpi(Dots Per Inch)
每英寸上的像素點數,機關dpi,與像素無關的機關;像素密度與螢幕尺寸,螢幕分辨率有直接的關系
标準螢幕像素密度(mdpi) ,每英寸長度上有160個像素點(160dpi)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9kFROpXV65UeFRVT3V1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3EzM3EDOxEjM1ADOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
像素密度是清晰度很重要的一個概念:即像素密度越高(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 |
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、代碼适配
三、布局适配
布局适配是要使用多套布局來達到适配。如手機和平闆的适配就需要使用到布局适配。
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布局,是以使用布局别名很容易解決這個問題。
- 在layout檔案下建立main_onepanes,main_twopanes兩個布局檔案
- 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(寬)
lay_y.xml(高)
有了基準之後,我們可以補全其他的尺寸如:1920*1080 1080/320=3.375px 1920/480=4px
最後,把這些檔案放到res檔案下:
分辨率為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" />
缺點:
- 由于實際上還是使用px作為長度的度量機關,是以和google的要求使用dp作為度量機關會有所背離
- 必須盡可能多的包含所有分辨率,因為這個是使用這個方案的基礎,如果有某個分辨率缺少,将無法完成該螢幕的适配
- 過多的分辨率像素描述xml檔案會增加軟體大小和維護難度。
4、頭條适配方案
核心原理: 目前裝置螢幕總寬度(機關像素)/設計圖總寬度(機關為dp)=density
density的意思就是1dp占用目前裝置多少像素。
路徑:ttps://github.com/JessYanCoding/AndroidAutoSize
侵入式少,可以随時更換,還可以自定義。
五、圖檔适配
1、logo多套圖
2、點9圖檔