1. 程式人生 > >Android 螢幕適配之 dimens 適配

Android 螢幕適配之 dimens 適配

相信做手機端的 App 的小夥伴,只要是產品稍微大一點,就會面臨螢幕適配的問題,對於適配這個問題,網上眾說紛紜,以前雖然有零零散散的看過,但是沒有實踐過,也是在最近遇到這個需求的情況下才研究了一下,現在做個記錄。


1 參考連結

http://blog.csdn.net/qq_34161388/article/details/73469319

首先需要明白一些概念,比如什麼是 px,什麼是 dp,什麼是 dpi,講這些概念的文章很多,推薦一個:

http://www.jianshu.com/p/ec5a1a30694b


2 例子對比

Google 官方推薦在寫佈局檔案的時候使用 dp,在解析度相差不大的情況下,dp 確實能自己進行一定適配,但是如果解析度比較大的時候,還是會有問題,隨便寫個佈局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginLeft="100dp"
        android:layout_marginTop="250dp"
        android:src="@mipmap/ic_launcher" />
</RelativeLayout>



上面兩個圖,左邊是Galaxy Core mini,解析度為 800x480,右邊是魅藍 metal,解析度 1920x1080,可以看到還是有明顯差別的,這個時候我們就應該想到適配,那麼適配的方式有很多,比如洋神的 AutoLayout(已經停止維護了,不建議在專案中使用),還有寫多個 layout 佈局呀,還有 dimens 適配呀等等,在對比了多種方法後,最後我採用了 dimens 適配這種方式。這樣的適配方式雖然會加入很多不同解析度的 dimens 檔案,但是比起寫多個 layout 佈局,要修改 UI 的時候需要修改很多 layout 的情況,還是要方便一點,最主要的是寫佈局的時候方便一點。


 3 使用方法

使用方法也就是建立多個不同解析度的 values 資料夾,比如主流的解析度:values-800x480、values-1280x720、values-1920x1080,而在 Android 中規定是以 480x320 為基準的,所以這個可以放到預設的 values 資料夾下:



然後在每個資料夾下放對應的 dimens.xml 檔案。比如預設的 values 資料夾下面的 dimens 檔案是這樣的:

<?pxml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="px1">1px</dimen>
    <dimen name="px2">2px</dimen>
    <dimen name="px3">3px</dimen>
    <dimen name="px4">4px</dimen>
    ......
    <dimen name="px1397">1397px</dimen>
    <dimen name="px1398">1398px</dimen>
    <dimen name="px1399">1399px</dimen>
    <dimen name="px1400">1400px</dimen>

</resources>


那麼 values-1280x720 資料夾下面的 dimens 就是這樣的:

<?pxml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="px1">2.25px</dimen>
    <dimen name="px2">4.5px</dimen>
    <dimen name="px3">6.75px</dimen>
    <dimen name="px4">9px</dimen>
    ......
    <dimen name="px1397">3143.25px</dimen>
    <dimen name="px1398">3145.5px</dimen>
    <dimen name="px1399">3147.75px</dimen>
    <dimen name="px1400">3150px</dimen>

</resources>


values-1920x1080 下面的 dimens 就是這樣:

<?pxml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="px1">3.375px</dimen>
    <dimen name="px2">6.75px</dimen>
    <dimen name="px3">10.125px</dimen>
    <dimen name="px4">13.5px</dimen>
    ......
    <dimen name="px1397">4714.875px</dimen>
    <dimen name="px1398">4718.25px</dimen>
    <dimen name="px1399">4721.625px</dimen>
    <dimen name="px1400">4725px</dimen>

</resources>


你沒看錯,就是 px,這樣我們可以直接用 px 來寫佈局檔案了,而不用對著設計圖去換算了,而且我們既然可以將 480x320 的解析度作為基準,那麼同樣也可以以我們的設計圖的解析度作為基準,比如我是以 1280x720 作為基準的,只要比例不變就行了,如果以 1280x720 為基準,那麼 values-1920x1080 的 dimens 則應該是:

<?pxml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="px1">1.5px</dimen>
    <dimen name="px2">3px</dimen>
    <dimen name="px3">4.5px</dimen>
    <dimen name="px4">6px</dimen>
    ......
    <dimen name="px1397">2095.5px</dimen>
    <dimen name="px1398">2097px</dimen>
    <dimen name="px1399">2098.5px</dimen>
    <dimen name="px1400">2100px</dimen>

</resources>

這樣設計圖上是多少我們就寫多少,再也不用去換算了。


4 dimens 檔案生成器

但是這麼多 dimens 檔案不可能手寫,推薦一個 dimens 檔案自動生成器:

http://download.csdn.net/download/github_2011/9849086

使用方法:



5 特別適配

有的手機是有虛擬按鍵的,比如 nexus、華為,這些有虛擬按鍵的手機,解析度是將虛擬按鍵的高度算進去了的,但是 Android 在對 values 適配的時候卻不會將虛擬按鍵的高度算進去,比如一個手機的解析度本來是 1920x1080,但是虛擬按鍵欄佔了120,那麼真實高度就是1800,在適配的時候就不會去找1920x1080了,而是會去找低一級的解析度了,比如 1280x720了,那麼佈局又會出問題了,怎麼辦呢?既然它算的時候就沒有算虛擬按鍵欄的高度,那麼我們可以獲取虛擬按鍵欄的高度:

    /**
     * Description:獲取螢幕真實高度(不包括虛擬按鍵欄)
     * Date:2017/9/2
     */
    public static int getScreenHeight(Context context) {
        return context.getResources().getDisplayMetrics().heightPixels;
    }


然後根據這個高度來定義 values 資料夾,比如真實高度是1800,那麼就應該加一個 values-1800x1080 資料夾,裡面的 dimens 與 values-1920x1080 一樣就行了。那麼問題來了,不同手機的虛擬按鍵的高度也是不一樣的,不可能寫 values-1790x1080、values-1780x1080 這麼多資料夾,上面說了找不到這個解析度的時候,就會去找低一級的解析度,所以我們寫一個最低的就行了,比如values-1760x1080,那麼 1790x1080、1780x1080 都會去找 1760x1080 了。

6 總結

螢幕適配其實說麻煩也麻煩,說簡單也簡單,麻煩是因為檔案太多,簡單是因為步驟固定,這也就是我為什麼選擇用 dimens 適配的原因,生成一下 dimens 檔案的麻煩程度我還是可以接受的,只要將正確的 dimens 檔案放到工程中,後面也就不用考慮其他的了。