當你只有一個設備的時候,如何作好屏幕適配

版權聲明:java

本帳號發佈文章均來自公衆號,承香墨影(cxmyDev),版權歸承香墨影全部。android

每週會統一更新到這裏,若是喜歡,可關注公衆號獲取最新文章。shell

未經容許,不得轉載。佈局

1、多機型 UI 適配

在 Android 開發的工做平常中,UI 適配是一件比較重要的事情。通常開發新的功能,有新的頁面,最終開發完成發佈以前,都須要讓設計師來審 UI 效果。性能

而有時候,明明咱們已經在一款標準的 3 倍手機上,作到了讓設計師小姐姐滿意的效果,可是當換了另一臺手機的時候,效果又不那麼如意。ui

傳統的作法是,拿到效果不對的手機,單獨適配看看是否是哪裏佈局寫的不對致使效果不正確,而後改正它。可是總能碰到咱們拿不到真實設備的狀況。設計

本文就介紹一個命令,能夠修改你當前設備的參數,來模擬出目標設備的顯示效果,讓你獨立就把多機型 UI 效果確認的事情給作了。3d

2、WM 命令

2.1 什麼是 WM 命令

說的這麼厲害,實際上須要使用的就是一行 wm 命令,能夠經過 adb shell 來操做它。code

wm 命令主要用來幫助咱們修改一些屏幕的參數,先來看看它的文檔。使用 adb shell wm 命令,能夠方便的查看 wm 的文檔描述cdn

/wm-doc.png
/wm-doc.png

能夠看到,wm 命令能夠幫助咱們修改當前設備的 size 、 density 等參數,而這兩個參數就是決定了當前設備的顯示效果。

2.2 WM 的命令

從上面的文檔能夠看出,它其實支持的命令仍是挺多的,可是有一些根本用不上,是須要系統權限的,因此正常來講咱們是沒法使用的。那麼,仍是介紹幾個比較實用的命令。

如下例子都是在一款標準 density 爲 3 的設備上運行的,屏幕像素爲 1080px * 1920px。

一、wm size

wm size 命令,能夠用來查詢和修改當前設備的尺寸,若是想要修改尺寸,可使用 px 或者 dp 爲單位(默認爲 px),使用 x 進行鏈接,這個其實看看 wm size 的輸出,你就清楚了。

/wm-size.png
/wm-size.png

在這裏的例子中,作了幾件事情:

  1. 使用 wm size 命令查看當前設備的尺寸。
  2. 使用 wm size 命令將當前尺寸修改爲了 1000x2000。
  3. 再次使用 wm size 命令查看當前設備的尺寸。
  4. 最後使用 wm size reset 命令,將屏幕尺寸還原。
  5. 再用 wm size 命令,查看還原後的尺寸。

這幾個步驟就已經涵蓋了 wm size 命令的全部使用步驟,可使用它查看當前屏幕尺寸,而且修改屏幕尺寸和還原它。

二、wm density

wm density 命令,能夠用來查看和修改當前設備的 density 參數。

使用起來很簡單,直接上命令了。

/wm-redensity.png
/wm-redensity.png

在這個例子中,我作了幾件事情:

  1. 使用 wm density 查看當前設備的 density。
  2. 在使用 wm density 命令,修改當前設備的 density 爲 420。
  3. 而後再使用 wm density 查看修改後的參數。
  4. 最後使用 wm density reset 將設備的 density 還原。
  5. 最後再查看一下還原後的值。

三、wm overscan

wm overscan 命令,能夠修改當前設備的屏幕內邊距。其實我以爲這個命令沒什麼用處,可是仍是演示一下如何使用。

/wm-overscan.png
/wm-overscan.png

在這個例子中,作了幾件事情:

  1. 使用 wm overscan 修改邊距爲 20 。
  2. 而後使用 wm overscan reset 將其還原。

2.3 WM 命令的原理

wm 命令的邏輯很是的簡單,它其實是和 WindowManagerService 進行交互,經過 WMS 來修改屏幕相關的一些參數。

這裏就不介紹完整的 wm 源碼了,就以一個方法舉例來看看 wm 的邏輯。這裏就以 wm size 命令舉例好了。

首先,看看 wm 命令的入口。

/wm-onrun.png
/wm-onrun.png

這裏會初始化 mWm ,而且根據輸入的參數,調用不一樣的方法,若是輸入的是 size ,則會調用 runDisplaySize() 方法。

/wm-rundisplaysize.png
/wm-rundisplaysize.png

runDisplaySize() 方法中,會先判斷 size 命令後面有沒有跟其它參數,若是沒有,則認爲是一次查詢操做,會將查詢到的結果輸出。

而若是是 reset 方法的話,就將 w 、h 這兩個表明寬高的值,設置爲 -1,最終會經過 mWm.clearForcedDisplaySize() 方法,將屏幕的 size 還原。

否者就從輸入的參數中,經過 x 進行分割,拿到咱們輸入的寬高。最終經過 mWm.setForcedDisplaySize() 方法,將當前屏幕的 size 修改爲咱們輸入的結果。

在設置size 的時候,還會經過 parseDimens() 方法,從新計算一下輸入的尺寸。

/wm-parsedimens.png
/wm-parsedimens.png

從這裏能夠看出,它支持兩個尺寸,px 和 dp ,若是若是不指定尺寸,則默認認爲是 px 。

到這裏就完成了一次經過 wm size 命令,修改設備屏幕參數的全過程,跟多細節能夠自行查閱源碼。

源碼的在線地址:

androidxref.com/7.1.1_r6/xr…

3、實施修改設備參數

既然已經講清楚 wm 命令的全部細節了,那麼咱們只須要拿到咱們須要適配的設備的 size 和 density。就能夠在咱們本身的設備上模擬出對應的效果。

我這裏收集了一些比較經常使用的設備參數,能夠供你們參考一下。

  • 魅族MX3:440,1080x1800
  • 一加5:420,1080x1920
  • 紅米NOTE,320,720x1280
  • 華爲MATE7,480,1080x1812
  • MOTO-G5,480,1080x1920
  • Moto-tx1095,432,1080x1790
  • Nexus5x,420,1080x1794
  • Nexus6p,560,1440x2392
  • 奇酷360,460,1080x1920
  • VivoX5,320,720x1280

固然,最重要的是拿到公司各類 CEO、CTO、CxO 正在使用的手機參數,進行一波適配,哈哈。

下面,咱們隨便挑兩個設備的參數進行修改,而後看看運行後的效果。

命令以下:

// 修改爲 一加5

adb shell wm density 420

adb shell wm size 1080x1920

// 修改爲 Moto-tx1095

adb shell wm density 432

adb shell wm size 1080x1790

下面,從作到右,分別是本來的尺寸、一加五、Moto-tx1095。

/wm-demo.jpg
/wm-demo.jpg

其實看着差別不大,只能說桌面佈局寫的挺好的,因此說,若是佈局寫的好的話,是能夠避免在不一樣設備上看着很明顯的不一樣的問題 ,就像如今這樣。

4、題外話

實際上 wm 命令,也是有一些其它問題的,例若有時候經過 wm 命令修改 UI 的的時候,刷新會不及時,會卡頓,因此選擇一個性能比較好的手機是一個緩解的辦法。或者修改參數以後,退出 App 從新進也是一個不錯的辦法。

若是調整到一個太特殊的參數,例如 200x1000 這種,可能渲染起來會很奇怪。可是若是隻是作一些常規設備參數的修改,只要修改值在合理的範圍內,通常都是能夠的。

公衆號二維碼.jpg
公衆號二維碼.jpg

點贊或者分享吧~

相關文章
相關標籤/搜索