更新時間:2024-04-12 09:28:45作者:佚名
你也可以看看我其他類似的文章,也會給你帶來一些好處!
擴展你的知識:
4k是什么意思?
1080p 和 720p 是什么意思?
如果不明白百度百科解析最后一段可以參考這里
在開始解釋dp之前,我們先來了解一些概念。
常用尺寸單位
px(像素):屏幕上的點,一般HVGA表示像素。
in(英寸):長度單位。
mm(毫米):長度單位。
pt(磅):1pt=1/72英寸,用于印刷行業,非常簡單易用;
解決
“分辨率”表示為每個方向上的像素數等。在某些情況下,還可以表示為“每英寸像素數”(ppi)以及圖形的長度和寬度。 例如,72ppi 和 8X6 英寸。
用于描述分辨率的單位有:dpi(每英寸點數)、lpi(每英寸線數)和 ppi(每英寸像素)。
Ppi 和 dpi 通常可以互換使用。 它們用于描述屏幕的屬性或性能。 從技術角度來說,“像素”(P)只存在于計算機顯示領域,“點”(d)只出現在印刷或打印領域。
使用ppi來描述手機屏幕屬性。 在開發過程中,每個文件都對應著dpi。這兩個單位的計算方法是一樣的,只是描述不同,只是因為使用場景不同。
QVGA:分辨率為240*480(VGA為四分之一)
HVGA:分辨率為320*480(半尺寸VGA是一半)
VGA:分辨率為640*480(全稱Video Array)
WVGA:分辨率為800*480(Wide VGA很多網頁的寬度為800,所以WVGA手機屏幕會更適合瀏覽網頁)
FWVGA:分辨率為854*480手機c8813
英寸是物理單位。 我們通常說的手機屏幕是4.3英寸。 4.5英寸指的是屏幕對角線長度,如下圖所示:
分辨率 480 x 800、屏幕尺寸 4.3 英寸和分辨率 540 x 960、屏幕尺寸 4.5 英寸的 DPI 為:
與分辨率無關的測量單位
支持下面列出的所有單位
下面幾個問題讓大家更深入的了解dp的定義和含義
1. 為什么指定規格的顯示器上1dp = 1px?
答:這個在公司官方文檔中有解釋,因為第一臺設備(HTC的T-G1)就屬于它。
尺寸 和 是尺寸和 mdpi() 。 這是基于第一款 T-G1,它具有 HVGA(直到 1.6,這是唯一的)。
為什么說它屬于?
T-G1的DPI,其實它準確的PPI并不等于160。G1的配置信息如下:
屏幕尺寸:3.2英寸(8.1厘米)
分辨率:320×480(HVGA)
如果按照上面的計算方法,T-G1應該屬于。 用計算器計算,結果是180。
為什么不直接使用 180 作為基準 (mdpi) 而不是 160?
180不太好適應dpi是什么意思,但是160無論是乘以0.5/2/1.5都很容易適應。 這就是為什么它屬于而不是等于。
為什么選擇一個作為標準呢?
其實為了不針對每個設備廠商做適配(其實資源文件的分包也算適配:-hdpi、-ldpi),不同屏幕尺寸、不同dpi的設備大致分為四類,如圖以下:
可以看到,T-G1的參數屬于mdpi區域,以上就是以它們為基準的原因。
編程過程中獲得的dpi與手動計算的dpi不同。 由于這里的分類,不同 dpi 設備上的縮放比例略有不同。 詳細請看下面第三點。
2. DP
如果有興趣,可以看一下這個類的源代碼(網站):.util。 (.java)。 這個類有非常詳細的dpi相關的成員函數和變量。 下面的代碼是開發時獲取dpi的代碼。
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
iDensity = (int)( metrics.density * 160 );
2.1. 為什么要引入dp?
答:dp其實就是dip(像素),獨立密度像素,也就是說與密度(dpi)無關。
我使用dp作為單位設置控件。 無論您的屏幕尺寸或dpi如何,顯示效果始終保持一致。
例子:
不要使用dp,使用px效果
如果我們不引入dp,仍然使用原來的px,那么現在我們需要在手機屏幕上畫一條直線。 在(每英寸160像素)、寬度為1英寸的手機上,我們將這條線的長度設置為160px(占用160像素),即直線的長度正好是手機的寬度。 但是(每英寸240像素),如果這個應用安裝在寬度為1英寸的手機上,長度僅為屏幕寬度的2/3。
類似下面的效果:
使用dp的效果
為了使用戶界面能夠在當前和未來的顯示類型上正確顯示,建議您始終使用 sp 表示文本大小單位,使用 dup 表示其他元素。當然,您也可以考慮使用矢量圖形而不是位圖
2.3. px和dp的換算公式
px和dp之間的換算公式:px = dp * (dpi / 160)
dp:dp 是一個像素,表示 160 dpi 下的像素大小(每英寸點數:每英寸點數)。
dp是dip:(與設備無關的像素)
dp 是與密度無關的像素單位。 在每英寸 160 點的屏幕上,1dp = 1px
不同的設備有不同的顯示效果。 這與設備硬件有關。 一般來說,為了支持WVGA、HVGA和QVGAdpi是什么意思,我們推薦使用這個,它不依賴像素。
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clickme"
android:layout_marginTop="20dp" />
sp:sp 是相同的基本單位,但由用戶的文本大小(它是縮放像素)決定,因此在文本大小時使用此單位(但從不用于大小)。
(縮放像素)。 主要用于定義字體大小,不再使用
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp" />
px:(像素)。 不同設備顯示效果相同。 一般來說,HVGA代表像素,用得比較多。
3、為什么手動計算的dp對應的px大小與實際顯示的px不一樣
1、不同手機上的控件大小和屏幕比例其實是差不多的。 由于屏幕尺寸、像素密度等緊密歸為一類dpi,因此實際顯示的px與手動計算的px尺寸存在一定差異。
由于 的劃分,使用了 dp 作為長度單位,導致計算出的 px 與實際顯示的 px 不一致。
設備 1:索尼 Z2 屏幕尺寸:5.2 英寸 屏幕分辨率:1080*1920 DPI:424
設備2:華為Mate 7 屏幕尺寸:6.0英寸 屏幕分辨率:1080*1920 DPI:367
應用公式 px = dp * (dpi / 160),開發人員編寫了一個高度為 48dp 的控件。
索尼Z2上的渲染像素為:48*424/160=127.2px
華為Mate 7上的渲染像素為:48*367/160=110.1px
這顯然是荒謬的。
1、出現小數點像素數,像素最小單位為1,設備上無法顯示。
2、根據實際截圖測試,索尼Z2實際渲染像素為144px(@3x),華為Mate 7實際渲染像素為144px(@3x)。
也就是說,實際渲染的像素并不是按照這個公式計算的。 它是根據渲染倍率(即@2x、@3x)計算的。
實際渲染的像素如下:
在索尼Z2上實際渲染的像素為:48@3x=144px
華為Mate 7上實際渲染像素為:48@3x=144px
原因:
作為基準,對應的是1.0(mdpi),對應的是1.5(hdpi),對應的是2.0(xhdpi)...
最關鍵的一點是,真實手機屏幕的ppi將是最接近上述標準的標準ppi! 然后根據最接近的ppi來決定。
限定符指定比例
LDPI
低密度 (ldpi) 屏幕 (0dpi~) 的資源。
1dp=3/4像素
平均密度指數
中密度 (mdpi) 屏幕的資源 (~)。 (這是基線密度。)
1dp = 1 像素
高清晰度
高密度 (hdpi) 屏幕的資源 (~)。
1dp = 1.5 像素
高清像素
超高密度 (xhdpi) 屏幕的資源 (~)。
1dp = 2 像素
超高密度()屏幕的資源(~)。
1dp = 3 像素
超超高密度()屏幕的資源(~)。
1dp = 4 像素
2.這是一個假設,使用手動計算的dpi(通過公式dpi = 屏幕對角線像素數(px)/屏幕對角線長度(in)),相同的dp在不同的移動設備上顯示相同的物理尺寸手機,而不是相同的屏占比。
px和dp之間的換算公式:px = dp * (dpi / 160)
px = dp * (dpi / 160) = dp * (px (屏幕對角線像素) / in (屏幕尺寸) / 160)
因此,當dp不變且in不變時,屏幕對角像素數越多,控件的px就越大。
這是一個例子:
手機類型 屏幕對角線像素數 屏幕尺寸 顯示像素數 160dp 顯示英寸數 160dp 占屏幕對角線比例
手機A
480像素
3英寸
160
1英寸
1/3
手機B
640像素
2英寸
320
1英寸
1/2
手機C
960像素
3英寸
320
1英寸
1/3
即使使用dp,也不能保證理論上所有手機都能完美適配。
本質上是規定160dp等于1in,但是內部已經為手機做了很好的dpi劃分,所以使用dp就成為了解決手機適配的方法。 您可以使用多部手機進行驗證。
那么為什么用dp作為長度單位可行呢?
有可能在手機的發展過程中,手機A不會從手機B變成手機B。即使有估計,也不會有這么大的反差(屏幕會縮小1/3)并且分辨率將增加1/2)。
另外,我估計手機廠商已經在內部設置好了dpi值。 谷歌在對屏幕進行分類時也處理了這些問題。 關于手機對應的dpi如何分類,請參考這里。
本質上是規定160dp等于1in,但是內部已經為手機做了很好的dpi劃分,所以使用dp就成為了解決手機適配問題的方法。
總結:dp也是dip。 這和sp基本類似。 如果設置長度和高度等屬性,可以使用dp或sp。 但如果設置字體,就需要使用sp。 dp與密度無關,sp不僅與密度無關,而且與尺度無關。
如果屏幕密度是160,那么dp、sp和px是相同的。 1dp=1sp=1px,但是如果以px為單位的話,如果屏幕尺寸不變(假設還是3.2英寸),那么屏幕密度就變成了320。那么原來的寬度設置為100px,在上面看起來就矮了一半密度為320的3.2英寸屏幕與密度為160的3.2英寸屏幕相比。
但如果設置為100dp或100sp。 系統會自動將width屬性值設置為200px。 即100 * 320 / 160。其中320/160可以稱為密度縮放因子。 也就是說,如果你使用dp和sp,系統會根據屏幕密度的變化自動進行轉換。
px和dp相互轉換代碼
package com.hujl.util;
import android.content.Context;
public class DensityUtil {
/**
* 根據手機的分辨率從 dp 的單位 轉成為 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
//因為有的dpi為160的1.5倍,所以計算完后,為了沒有小數,加0.5
return (int) (dpValue * scale + 0.5f);
}
/**
* 根據手機的分辨率從 px(像素) 的單位 轉成為 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
參考:
該博客混淆了 dpi 和 ppi: