天天看點

Android螢幕适配簡單方案

簡單的螢幕适配方法。使用腳本生成最小寬度限定符的 dimen.xml 檔案,如 values-sw320dp 這樣的資源目錄。

Android螢幕适配簡單方案

說明

我們知道,Android碎片化十分嚴重,各種螢幕分辨率充斥市場。為了讓使用者有一緻性的體驗,對Android手機進行适配勢在必行。适配方法也有許多種,以下進行簡單的說明。

正常适配方法

  • 能使用

    match_parent

    wrap_content

    android:layout_weight

    的地方盡量使用。
  • 如要寫具體長度或字型大小,使用 dp 和 sp 作為機關(能适配絕大部分情況)
  • 使用相對布局

以最小寬度限定符進行适配

在 Android3.2 (api 13) 之後支援用最小寬度限定符來進行适配,最小寬度的機關是 dp.

适配方法舉例:

如果要使用最小寬度為320dp,360dp,411dp 作為限定符,在

res

目錄下建立 values-sw320dp,values-sw360dp,values-sw411dp 這三個目錄,并在裡面建立 dimens.xml

假如以 360dp 作為基準,以 100dp 舉例,那麼這3個dimens.xml裡面設定的大小分别為以下3個:

<dimen name="xdp_100.0">88.00dp</dimen>
<dimen name="xdp_100.0">100.0dp</dimen> <!-- base -->
<dimen name="xdp_100.0">114.00dp</dimen>
           

在引用的時候使用

@dimen/xdp_100.0

則會在最小寬度為 320dp,360dp,411dp 以上分别轉換為相應的值(88.00dp, 100.0dp, 114.00dp)。

本文就是圍繞這種方式,通過腳本生成幾套這樣的适配檔案。

使用方法

shell方式

shell

目錄下的 auto_res_tool.sh 拷貝到項目的主 module 目錄下(比如app目錄),用文本編輯器,比如 NotePad++ 打開這個檔案。我們需要修改一下配置來生成我們想要的 dimens.xml 檔案。

DIMEN_VALUE=("360" "320" "411")

#dp屬性名
DIMEN_ATTRIBUTE_NAME="xdp"
#生成的dimen的個數
DIMEN_NUM=
#dimen的間隔
DIMEN_STEP=

#sp屬性名
SP_ATTRIBUTE_NAME="xsp"
#sp個數
SP_NUM=
#sp步進
SP_STEP=
           

這個

DIMEN_VALUE

是個數組,裡面裝了需要生成的 value-swXXXdp 目錄及其 dimens.xml 的依據,第一個值作為 基準,後面依次放需要生成的目錄。最好是以你目前進行開發的手機作為基準, 按照上述代碼的配置将會生成 values-sw320dp,values-sw360dp,values-sw411dp 這三個目錄,生成的形式如下(values-sw360dp/dimens.xml裡的)

<!-- dp -->
<dimen name="xdp_0">0dp</dimen>
<dimen name="xdp_0.5">0.5dp</dimen>
<dimen name="xdp_1.0">1.0dp</dimen>
...
<dimen name="xdp_499.5">499.5dp</dimen> <!-- 共計 1000 條 -->

<!-- sp -->
<dimen name="xsp_0">0sp</dimen>
<dimen name="xsp_1">1sp</dimen>
<dimen name="xsp_2">2sp</dimen>
...
<dimen name="xsp_39">39sp</dimen> <!-- 共計 40 條 -->
           

修改妥當之後,打開 shell 終端(如果在windows上沒有,推薦使用 babun 這個bash終端),運作

然後就等待它自動生成這幾套檔案吧

Note: 生成完成之後,别忘了把你的最小的限定符裡面的 dimen 資源拷貝一份到最原始的

values/

目錄下的 dimens.xml ,因為如果某個機型比你設定的最小的限定符的寬度還要小(比如小于上述的 320dp),則會因為在預設的 dimens.xml 裡找不到該資源而抛出異常并crash掉。

自動替換 dimens 資源腳本: 好了,現在你可以使用生成的 dimens 資源進行适配了。如果你的項目裡面存在大量的 dp 使用,需要替換成你生成的 dimens 資源,如果一個個去改,那實在太麻煩了。本項目提供了自動替換腳本 replace.sh,把此檔案拷貝到主module目錄下,像剛剛那樣,打開此檔案,進行配置:

#dp屬性名
DIMEN_ATTRIBUTE_NAME="xdp"
#sp屬性名
SP_ATTRIBUTE_NAME="xsp"
           

然後運作之:

./replace.sh
           

坐等幾分鐘,你的項目裡面所有用 dp 的地方将會替換為

@dimen/你設定的屬性名_數值

python方式

暫沒加入,等待後續更新…

效果一覽

現有兩個實驗對象

* 手機1号,4英寸,480 * 800 分辨率,最小寬度 320dp

* 手機2号,5.2英寸,1080 * 1920 分辨率,最小寬度 411dp

現在用一個 ListView 作為測試,它的每個 Item 高度為 100dp,測試如下圖:

Android螢幕适配簡單方案
Android螢幕适配簡單方案

可以看到,1号隻顯示了4.5個item,而2号顯示了5.5個item

現在将剛剛的 100dp 替換為我們生成的 dimen 資源

@dimen/xdp_100.0

,測試如下圖:

Android螢幕适配簡單方案
Android螢幕适配簡單方案

可以看到,顯示的item數幾乎是一模一樣的了,其中圖檔的寬高,字型的大小沒有替換,這裡隻測試item的高度,如果其它寫死的長度也替換了,那麼兩部手機的體驗将會一模一樣。

注意

建議用自己正在測試的手機的最小寬度作為基準,因為從設計師那裡拿到設計圖後,它是以一定分辨率進行設計的(一般 720 * 1280),這樣你使用生成的數值就剛好等于你通過設計稿計算出來的數值。比如例子中的

<dimen name="xdp_100.0">100.0dp</dimen>

設計稿到 dp 的轉換如下圖所示:

Android螢幕适配簡單方案

Github傳送門