1 Android螢屏適配相關概念
1.1 螢屏尺寸(Screen Size)
螢屏尺寸是螢屏的對角線的長度,單位是英寸,1英寸等于2.54厘米,比如常見的螢屏尺寸有3.5、4.0、5.5等,
1.2 螢屏解析度(Screen Resolution)
螢屏解析度是指在橫向和縱向上的像素點數、單位是px(pixel),1px等于1個像素點,一般設備的螢屏解析度以“縱向像素x橫向像素”來表示,例如1920x1080,
1.3 度量單位px、dp(dip)、ppi、dpi、sp、pt
1.3.1 像素px(pixel)
像素,1px代表物理螢屏上面的一個像素點,由于Android設備解析度繁雜、廠商過多的原因,px在實際的開發程序中不建議被使用,如寬高都為100px的圖片,在不同解析度的設備上可能顯示的大小不一致,如下圖(圖片來自android_developer_screens_support):

1.3.2 密度無關像素dp/dip(Density-independent Pixels)
密度無關像素是一個基于螢屏物理密度的度量單位,在160dpi的螢屏中1dp大約等于1px,當在更高密度的螢屏上運行時,用于繪制1dp的像素數量會被一個適合螢屏dpi的density因子放大,例如在320dpi的螢屏中1dp大約等于2px,而在低密度螢屏上,1dp的像素數量會減少,
也就是說,dp與px的比值與螢屏物理密度正相關,但不一定是正比,dp度量單位可以在布局中適當地調整UI組件的大小,以適合不同的螢屏密度,換句話說,它為您在不同設備上的UI元素的真實大小提供了一致性,
Android官方檔案《支持不同的像素密度》對于螢屏適配的觀點是:必須避免的第一個陷阱是使用像素px來定義距離或尺寸,使用像素來定義尺寸會帶來問題,因為不同的螢屏具有不同的像素密度,所以同樣數量的像素在不同的設備上可能對應于不同的物理尺寸,
例如下方同樣是4.0英寸的兩部手機,左邊那臺手機的解析度很低,是320x180,右邊那臺是960x540,如果將顯示字母a的圖片長寬都設定為100px,那么左邊手機顯示的a很大,而右邊手機顯示的a很小,

只有將顯示字母a的圖片長寬都設定為100dp,才能出現下面的效果,即該圖片在兩臺解析度不同的手機看起來大小差不多一致,而不是一大一小,

要在密度不同的螢屏上保持一個UI組件顯示出相同的尺寸,您必須使用密度無關像素 (dp) 作為度量單位來設計界面,dp 是一個虛擬像素單位,1 dp 約等于在在基準密度160dpi螢屏上的1px,對于其他每個密度,Android 會將此值轉換為相應的實際像素數,
1.3.3 像素密度ppi(pixels per inch)
像素密度是一個表示列印影像或顯示幕單位面積上像素數量的指數,一般用來計量電腦顯示幕、電視機和手機螢屏的精細程度,例如手機銷售商一般會標識出售手機的ppi,例如淘寶店中小米K30Pro手機標識的ppi為395,通常情況下,ppi越高的螢屏,螢屏顯示的內容更細膩和真實,其中ppi的計算公式如下:

以解析度1280*720、螢屏對角線尺寸為4.3英寸的設備為例:ppi = √(12802+7202) / 4.3 = 341.5359……≈342,
1.3.4 螢屏密度dpi(dots per inch)
螢屏密度是一個用于點陣數位影像的度量單位,意思是每一英寸長度中取樣點或可顯示點的數目,為簡便起見,Android 將所有螢屏密度分組為六種通用密度,具體如下表:
| 類別 | 螢屏密度dpi | 密度無關像素dp的縮放因子density |
|---|---|---|
| ldpi | ~120dpi | 0.75 |
| mdpi | ~160dpi | 1.0 |
| hdpi | ~240dpi | 1.5 |
| xhdpi | ~320dpi | 2.0 |
| xxhdpi | ~480dpi | 3.0 |
| xxxhdpi | ~640dpi | 4.0 |
1.3.4.1 密度無關像素dp的縮放因子density
在《Android官方檔案-Reference-DisplayMetrics.density》中對螢屏密度dpi的縮放因子density有以下的解釋:
density是密度無關像素dp的縮放因子,體現在android.util包中的DisplayMetrics.density 欄位,將dp單位轉換為px單位時,該欄位是必須使用的縮放系數,160dpi螢屏的density是1,而240dpi螢屏的density是1.5,以此類推,利用density可以簡單轉換dp和px這兩個度量單位:
px = dp * density = dp * (dpi / 160)
假設在某一應用中,用戶的手指至少移動16px之后,系統才會識別出滾動或滑動手勢,在160dpi基準螢屏上,用戶必須移動 16 pixels / 160 dpi(等于一英寸的 1/10 或 2.5 毫米),系統才會識別該手勢,而在配備高密度顯示屏 (240dpi) 的設備上,用戶的手指必須至少移動 16 pixels / 240 dpi,相當于 1 英寸的 1/15(1.7 毫米),此距離短得多,因此用戶會感覺應用在該設備上更靈敏,
要解決此問題,必須在代碼中以 dp 表示手勢閾值,然后再轉換為實際像素,例如:
//以dp為度量單位的手勢閾值
private static final float GESTURE_THRESHOLD_DP = 16.0f;
//獲得當前設備的密度無關像素dp的縮放因子density
final float density = getResources().getDisplayMetrics().density;
//基于density將dp轉化為當前設備適應的px,
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * density + 0.5f)
//使用以px為度量單位的mGestureThreshold變數值作為當前APP的手勢閾值
DisplayMetrics.density 欄位根據當前像素密度指定將 dp 單位轉換為像素時所必須使用的縮放系數,在中密度螢屏上,DisplayMetrics.density 等于 1.0;在高密度螢屏上,它等于 1.5;在超高密度螢屏上,等于 2.0;在低密度螢屏上,等于 0.75,此數字是一個系數,用其乘以 dp 單位,即可得出當前螢屏的實際像素數,
1.3.4.2 ppi與dpi的區別
dpi(dots per inch)、ppi(pixels per inch),前者突出dot(物理像素點),后者突出pixel(像素),dot是一個物理的像素點,pixel就不一定了,一個pixel可能由很多個物理dot組成,
PPI描述了數字影像的像素解析度,而DPI描述了列印影像上的墨點數量,盡管PPI在很大程度上是指螢屏顯示,但它也會影響設計的列印尺寸,從而影響輸出的質量,而DPI與數字化無關,主要涉及印刷,
對Android而言,dpi等同于ppi,具體可以參考PPI vs. DPI: what’s the difference?
1.3.5 縮放無關像素sp(Scale-independent Pixel)
在定義文本大小時,應該用可縮放像素sp作為單位,sp與dp很類似,但唯一的區別是:Android系統允許用戶自定義文字尺寸大小(小、正常、大、超大等),當文字尺寸是“正常”時,1sp=1dp,而當文字尺寸是“大”或者“超大”時,1sp>1dp,
1.3.6 點pt(point)
pt在兩種環境中有兩種不同的含義:在PhotoShop中,pt用來指定電子影像的尺寸并映射到印刷設備;而在iOS應用開發中,pt用來將指定電子影像的尺寸并映射到iOS設備,
但在上述兩種環境下,pt都是邏輯單位,用來隔離輸出設備的精度差異,保證輸出結果的物理尺寸不會忽大忽小,
1.3.6.1 iOS設備中的點pt(point)
在iOS應用開發中,pt用來將指定電子影像的尺寸并映射到iOS設備,在163ppi的iOS設備中,1pt映射成1px,且1inch(英尺)等于163pt,而對于其他不同ppi的iOS設備,1pt可能會映射成2px、3px等像素,具體可參考下述表格:

1.3.6.2 PhotoShop中的點pt(point)
在PhotoShop中,pt用來指定電子影像的尺寸并映射到印刷設備,其中PhotoShop指定,當ppi為72時,PhotoShop中1pt映射成1px,且1inch等于72pt,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/272523.html
標籤:其他
