版權聲明:shell
本帳號發佈文章均來自公衆號,承香墨影(cxmyDev),版權歸承香墨影全部。ide
每週會統一更新到這裏,若是喜歡,可關注公衆號獲取最新文章。佈局
未經容許,不得轉載。字體
昨天發了一篇文章,講解修改設置中『字體大小』,到底影響的是什麼。有興趣的能夠先去看看:《》3d
而在設置中,除了設置『字體大小』以外,還有一個『顯示大小』的設置,本片文章就來聊聊,當你修改『顯示大小』以後,你到底在修改什麼?code
在 UI 適配的時候,咱們通常推薦使用 dp 設置距離和大小,而使用 sp 來設定字體大小。cdn
在使用 dp 爲單位來作屏幕適配的時候,影響效果的主要有屏幕像素和 density,當你知道這兩個參數以後,你就能很清晰的知道,假如你想寫一個全屏的 UI 的時候,除了使用 match_parent 以外,你還能夠直接指定一個絕對的 dp 值,進行全屏化。xml
首先說點題外的概念,你想經過 DisplayMetrics 獲取到設備的 density 的時候,你會發現它實際上有兩個值:density 和 densityDpi。對象
例如正常咱們所說的 3 倍的手機,density 爲 3.0 ,densityDpi 爲 480。blog
它們之間的關係,就是以 160 爲基準倍數,進行計算,公式以下:
density * 160 = densityDpi
不過這裏對它們的理解,最好不要硬記名稱,在不少場景下,說到 density 就是咱們這裏說的 densityDpi。咱們只須要看它們的值就知道它們的關係,畢竟不會有一個 480倍(density)的手機。
拿到一個標準的屏幕尺寸,例如一個標準的 3 倍的手機,它的參數以下:
經過這些參數,咱們就能夠算出,該設備全屏支持的 dp 值就是 360dp*640dp。
瞭解到一個 3 倍的設備,設置全屏須要寫 360dp * 640dp ,接下來咱們就開始寫個 Demo 來看看效果。
這裏只是作一個橫向的鋪滿屏幕的設定,屏幕寬度鋪滿須要 360dp。咱們這裏使用一個 TextView 來設定十個字符,每一個字符的尺寸爲 36dp。同時下面作一個 View 鋪滿屏幕 360dp。
讓咱們看看在設備上運行的效果:
而當咱們在設置頁面中,修改了『顯示尺寸』以後,顯示的效果就不同了。
前面設置頁面中,『顯示尺寸』的設定,能夠設置三個值:小、默認、大。
先看看調小以後的效果:
能夠看到,將『顯示尺寸』調小以後,360dp 已經沒法鋪滿橫向的一屏了。
再來看看,當它調整到大的時候,顯示的效果吧。
能夠看到,調大以後,一行字,雖然同爲 36dp 的文字已經寫不下一行了,基本上已經超出了屏幕以外。
既然已經知道了現象,那麼咱們看看,當咱們調整了『屏幕尺寸』以後,咱們到底改變了什麼。
前面提到,獲取到屏幕相關的一些參數,可使用 DisplayMetrics 這個對象來獲取。
示例代碼以下:
在『屏幕尺寸』爲默認的時候,咱們是已經知道它的輸出了,接下來運行看看在屏幕尺寸爲大的時候,輸出的值。
經過輸出的 Log,看到其實屏幕的像素尺寸並無改變,而它的 density 卻發生了改變。
這也致使,橫向的 dp 尺寸,由本來的 360 變成了 320(1080/3.375),因此纔會致使本來適配的很好的 UI ,已經在一屏之中顯示不下的緣由。
相反,當『屏幕尺寸』設置爲 小 的時候,實際上縮小了 density ,從而加大了鋪滿一屏的 dp 尺寸,致使文字沒有恰好顯示一屏。
使用 DisplayMetrics 的方式,還須要寫代碼來驗證。有一個更簡單的方式來驗證它,就是使用 wm 命令來驗證,它能夠支持獲取到當前屏幕的 density。
adb shell wm density
從輸出的結果也能夠看到,它是有一個 Physical density 和 Override density 的,從字面意思,不難看出它們的含義。
wm 命令就是前面提到的一個很典型的 density 和 densityDpi 概念互通的例子,這裏說的 density 就是 DisplayMetrics 中的 densityDpi,你們瞭解一下就能夠了。
來看看,當『屏幕尺寸』設置爲大的時候,wm
命令輸出的結果吧。
到這裏,就能夠得出結論,當你修改設置頁面的『屏幕尺寸』的時候,實際上你在修改你設備的 density 值,它也決定了你的 UI 是如何顯示在屏幕上的。
點贊或者分享吧~