Android多屏幕尺寸適配原理

Html 字體大小單位 px em pt

網頁上定義字體大小有常見三種單位,px、em、ptcss

px

px是pixel縮寫,是基於像素的單位.在瀏覽網頁過程當中,屏幕上的文字、圖片等會隨屏幕的分辨率變化而變化,一個100px寬度大小的圖片,在800×600分辨率下,要佔屏幕寬度的1/8,但在1024×768下,則只佔約1/10。因此若是在定義字體大小時,使用px做爲單位,那一旦用戶改變顯示器分辨率從800到1024,用戶實際看到的文字就要變「小」(天然長度單位),甚至會看不清,影響瀏覽。 html

em

em:即%,是相對單位,是一個相對長度單位,最初是指字母M的寬度,故名em。現指的是字符寬度的倍數,用法相似百分比,如:0.8em, 1.2em,2em等。一般1em=16px。,通常用來測量長度的通用單位(例如元素週轉的頁邊空白和填充),當用於指定字體大小時,em單位是指父元素的字體大小。web

在一個頁面上給定了一個父元素的字體大小,這樣就能夠經過調整一個元素來成比例的改變全部元素大小.它能夠自由縮放,好比用來製做可伸縮的樣式表。shell

pt

PT是point(磅)縮寫,是一種固定長度的度量單位,大小爲1/72英寸。若是在web上使用pt作單位的文字,字體的大小在不一樣屏幕(一樣分辨率)下同樣,這樣可能會對排版有影響,但在Word中使用pt至關方便。由於使用Word主要目的都不是爲了屏幕瀏覽,而是輸出打印。當打印到實體時,pt做爲一個天然長度單位就方便實用了:好比Word中普通的文檔都用「宋體 9pt」,標題用「黑體 16pt」等等,不管電腦怎麼設置,打印出來永遠就是這麼大。瀏覽器

轉換

瀏覽器的默認字體高都是16px,因此未經調整的瀏覽器在顯示1em=16px,也就是說1px=0.0625em。爲了簡化font-size的換算,能夠在css中的body中先全局聲明font-size=62.5%,也就是定義了默認字體大小爲16px*0.625=10px,子元素會繼承父級元素的字體大小,因而1em=10px,因此12px=1.2em。px與em的轉換經過10就能夠得來。可是定義font-size=0.625em或者直接定義12px,這是沒有效果的。連接

Android開發常見的尺寸單位

inch

英寸,1 英寸約等於2.54釐米,主要用來描述手機屏幕的大小。
bash

DPI/PPI 

DPI = Dots Per Inch app

 PPI = Pixel Per Inch  字體

兩個參數的區別就在於Dot和Pixel的區別,dot值的是顯示器上每個物理的點,而pixel指的是屏幕分辨率中的最小單位。這個兩個難道會不同麼?會!當一個像素須要多於一個屏幕上的物理點來顯示的時候dot就跟pixel不同了。這個有另外一個叫法叫作dppx(dot per pixel),即每一個像素中有多少個點。大部分的顯示器中一個像素即一個點,但目前一些比較好的屏幕和一些手機屏幕中dppx會大於1。好比說Mac Retina,iPhone,HTC One等。 相信你們都遇到過一些人的電腦屏幕,看上去老是那麼傻大傻大的。就是由於他們把分辨率調的過低致使ppi變低了,讓畫面看上去那麼的不協調。看下面兩張圖片,我在一個1366x768分辨率的顯示器上把分辨率分別設置爲1366x768和1024x768所顯示的效果。 ui


 1024 x 768 spa


 1366 x 768  

可是大可能是狀況你們並不會把這兩個名詞分的那麼清楚,因此若是這兩個出現的時候基本上都表達的是同一個意思,即PPI(每英寸中有多少個像素)。 

PPI=屏幕對角線像素點數/屏幕對角線長度=( √ (屏幕橫向像素點^2 + 屏幕縱向像素點^2)/對角線長度)

舉例說明:若一款手機屏幕分辨率爲720px*1280px,4.3英寸。則點密度爲 √ (720^2 +1280^2) /4.3 = 342ppi。連接

分辨率 

分辨率這個詞在不少地方都有,好比相機、視頻、掃描儀。這裏說的就是顯示器的分辨率。顯示器是由一個個像素點(pixel)所組成的,通常所說的顯示器分辨率是1280x720就表示這個顯示器水平方向有1280個像素,垂直方向上有720個像素。可是並不是分辨率越高屏幕顯示效果越好,還須要根據屏幕的大小來決定。也就是要看像素的密度(pixel density),這個指標就是DPI(Dots Per Inch)或者PPI(Pixels Per Inch),即英尺屏幕上像素或者是點的個數。

屏幕密度

手機的屏幕密度一般指的是手機屏幕的dpi(dots per inch),也就是每英寸的像素數。對於Android手機來講,常見的dpi有以下幾種:

1. ldpi:對應的dpi範圍爲0 ~ 120,也就是說每英寸有0到120個像素點的屏幕的屏幕密度都屬於ldpi

2. mdpi:dpi範圍爲120 ~ 160

3. hdpi:dpi範圍爲160 ~ 240

4. xhdpi:dpi範圍爲240~320

5. xxhdpi:dpi範圍爲320~480

6.xxxhdpi: dpi範圍爲480~560

在實際開發中,一般以dpi值120、160、240、320、480分別指代ldpi、mdpi、hdpi、xhdpi、xxhdpi。一般屏幕密度越大的手機顯示的圖像會越細膩。能夠經過以下代碼獲取當前Android設備的屏幕密度:
private void getDpi() {DisplayMetrics dm = getResources().getDisplayMetrics();Log.i("TAG", "density = " + dm.density);Log.i("TAG", "densityDpi = " + dm.densityDpi);}複製代碼

若咱們在一臺屏幕密度爲320dpi的Android手機上運行以上代碼,會獲得以下輸出:

density = 2densityDpi = 320複製代碼

        上面輸出中的densityDpi就是Android手機屏幕的dpi值,那麼density是什麼呢?實際上它表明的是當前屏幕的dpi值與基準dpi值的比值,這個基準dpi值爲160。

dp(dip)

        Density-independent pixel, 是安卓開發用的長度單位,1dp表示在屏幕像素點密度爲160ppi時1px長度。上面咱們提到了選擇dpi值160做爲基準屏幕密度,這個基準屏幕密度人爲創建起了dp與px間的關係:在dpi爲160的Android設備上,1 dp = 1px。假設x爲某UI控件以px爲單位的大小,y爲同一UI控件以dp爲單位的大小,densityDpi表示屏幕密度,則x與y的關係爲:x = y * densityDpi / 160 或者 x = y *  density據此,還能夠計算出分辨率爲1080x1920,屏幕密度爲480dpi設備以dp爲單位的寬高值,寬度:1080 / 3 = 360dp

高度:1920 / 3 = 640dp,咱們在設計控件的寬度時要注意不能超過設備的最大寬度值。

sp

在介紹sp以前,咱們先來一塊兒看下TypedValue類中包含的一個用戶將dp、sp等單位轉換爲px的靜態方法:

public static float applyDimension(int unit, float value,DisplayMetrics metrics) {switch (unit) {case COMPLEX_UNIT_PX:return value;case COMPLEX_UNIT_DIP:return value * metrics.density;case COMPLEX_UNIT_SP:return value * metrics.scaledDensity;case COMPLEX_UNIT_PT:return value * metrics.xdpi * (1.0f/72);case COMPLEX_UNIT_IN:return value * metrics.xdpi;case COMPLEX_UNIT_MM:return value * metrics.xdpi * (1.0f/25.4f);}return 0;}複製代碼

若要將dp轉換爲px,會執行以下代碼:

return value * metrics.density;複製代碼

        density咱們在前面介紹過,指的是當前dpi與基準dpi(160)的比值。density的計算方式就是當前屏幕的dpi除以160。也就是說,在屏幕的dpi爲120、160、320、480時,density的值分別爲0.7五、一、二、3。
若要將sp轉換爲px,則會執行以下代碼:

return value * metrics.scaledDensity;複製代碼

        能夠看到,sp轉換爲px的計算公式與dp轉換爲px時類似,那麼scaledDensity是什麼呢?實際上,scaledDensity不一樣於density,scaledDensity是能夠動態改變的,當用戶改變了Android設備的字體縮放比例時,scaledDensity的值就會發生變化。scaledDensity的計算公式爲:scaledDensity = density * fontScale。其中fontScale表明用戶設定的Android設備字體縮放比例,默認爲1。也就是說,當用戶沒有改變Android設備的字體縮放比例時,sp、dp與px的換算是相同的。

在Android系統設置菜單中更改density、scaledDensity和分辨率

一般咱們在給頁面作UI適配時,會去找來不少臺不一樣的Android設備,其實咱們只須要到系統菜單中去設置density、scaledDensity和分辨率這些參數,而後就能夠在一臺Android設備上看到不一樣Android設備上的頁面展現效果,以huawei mate8手機爲例,進入到系統設置菜單顯示條目:


經過ADB shell命令更改density和分辨率

在終端輸入adb shell wm查看支持的命令集:


更改和查看density命令:


更改和查看分辨率命令:

相關文章
相關標籤/搜索