兩分鐘理解Android中PX DP SP的區別

2021-10-04 04:16:19 字數 2775 閱讀 6202

前言

眾所周知,android廠商非常多,各種尺寸的android手機、平板層出不窮。導致了android生態環境的碎片化現象越來越嚴重。google公司為了解決解析度過多的問題,在android的開發文件中定義了px、dp、sp,方便開發者適配不同解析度的android裝置。對於初級程式設計師來說理解掌握適配的一些基礎知識是必須的。

▲ 基礎概念 :

px : 其實就是畫素單位,比如我們通常說的手機分辨列表800*400都是px的單位

sp : 同dp相似,還會根據使用者的字型大小偏好來縮放

dp : 虛擬畫素,在不同的畫素密度的裝置上會自動適配

dip: 同dp

▲ 舉個栗子 : px與dp

pixel,即畫素,1px代表螢幕上的乙個物理的畫素點。但px單位不被建議使用。因為同樣畫素大小的在不同手機顯示的實際大小可能不同。要用到px的情況是需要畫1畫素**線或陰影線的時候,如果用其他單位畫則會顯得模糊。

要理解dp,首先要先引入dpi這個概念,dpi全稱是dots per inch,對角線每英吋的畫素點的個數,所以,它的計算公式如下: d

pi=h

eigh

t2+w

idth

2−−−−−−−−−−−−−−√si

zedpi=height2+width2size

比如height和width即為長寬的畫素,平方和即為對角線的畫素個數,size即我們常說的5寸手機、4寸手機中的5和4,即對角線的長度。

所以,一樣是5寸的手機,解析度越高,dpi越高。解析度相同,螢幕對角線英吋數越小,dpi越高。

而dp也叫dip,是device independent pixels。裝置不依賴畫素的乙個單位。在不同的畫素密度的裝置上會自動適配,比如:

在320x480解析度,畫素密度為160,1dp=1px

在480x800解析度,畫素密度為240,1dp=1.5px

計算公式:px = dp * (dpi/160)

我們做個簡單的sample驗證一下,如下,乙個布局**

android:layout_width="150px"

android:layout_height="wrap_content"

android:text="test px" />

android:layout_width="150dp"

android:layout_height="wrap_content"

android:text="test dp" />

在480*800解析度中,3.7螢幕對角線英吋數的裝置效果圖如下

在480*800解析度中,5.1螢幕對角線英吋數的裝置效果圖如下

由此可以看出使用px作為單位的,在不同的裝置中會顯示不同的效果。使用dp作為單位的,會根據不同的裝置進行轉化,適配不同機型。所以建議在長度寬度的數值使用dp作為單位。

▲ 再舉個栗子 : dp與sp

既然我們在上面說了,dp可以自動適配裝置機型,那在字型裡是否也同樣可行?我們再做個簡單的sample驗證一下,如下,乙個布局**

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="test dp"

android:textsize="20dp" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="test sp"

android:textsize="20sp" />

在480*800解析度中,3.7螢幕對角線英吋數的裝置效果圖如下

在480*800解析度中,3.7螢幕對角線英吋數的裝置下,我們修改手機系統字型大小,得到效果圖如下

由此可以看出使用sp作為字型大小單位,會隨著系統的字型大小改變,而dp作為單位則不會。所以建議在字型大小的數值要使用sp作為單位

▲ 拓展

提供乙個工具類:dp與px值轉換

public

class

densityutil

/*** 根據手機的解析度從 px(畫素) 的單位 轉成為 dp

*/public

static

intpx2dp(context context, float pxvalue)

}

兩分鐘安裝mysql

mysql 設定mysql客戶端預設字符集 default character set utf8 mysqld 設定3306埠 port 3306 設定mysql的安裝目錄 basedir e mysql mysql 8.0 11 winx64 設定mysql資料庫的資料的存放目錄 datadir ...

兩分鐘學會C

兩分鐘能學會c 嗎!請先閱讀下面的文章,再決定你要不要當程式設計師,或者學習c 在乙個類的函式中定義乙個變數,累加它。void paddyfield staticvaluetest 在主函式中,反覆呼叫這個函式,會怎樣?int main 結果 finished building target pad...

XStream兩分鐘教程 譯

兩分鐘教程 這是乙個關於xstream快速的介紹。快速瀏覽一下你會馬上知道把乙個物件轉換到xml或是轉換回來是多麼的簡單。你肯定會碰到下面的問題。建立能夠序列化的類 這是一組簡單的類。xstream能把這些類的例項轉換到xml或是轉換回來。public class person public cla...