兩分鐘理解Android中PX、DP、SP的區(qū)別

前言
眾所周知,Android廠商非常多,各種尺寸的android手機(jī)、平板層出不窮。導(dǎo)致了Android生態(tài)環(huán)境的碎片化現(xiàn)象越來越嚴(yán)重。Google公司為了解決分辨率過多的問題,在Android的開發(fā)文檔中定義了px、dp、sp,方便開發(fā)者適配不同分辨率的Android設(shè)備。對于初級程序員來說理解掌握適配的一些基礎(chǔ)知識是必須的。

▲ 基礎(chǔ)概念 :

px : 其實就是像素單位,比如我們通常說的手機(jī)分辨列表800*400都是px的單位
sp : 同dp相似,還會根據(jù)用戶的字體大小偏好來縮放
dp : 虛擬像素,在不同的像素密度的設(shè)備上會自動適配
dip: 同dp

▲ 舉個栗子 : px與dp
pixel,即像素,1px代表屏幕上的一個物理的像素點。但px單位不被建議使用。因為同樣像素大小的圖片在不同手機(jī)顯示的實際大小可能不同。要用到px的情況是需要畫1像素表格線或陰影線的時候,如果用其他單位畫則會顯得模糊。

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

比如height和width即為長寬的像素,平方和即為對角線的像素個數(shù),size即我們常說的5寸手機(jī)、4寸手機(jī)中的5和4,即對角線的長度。
所以,一樣是5寸的手機(jī),分辨率越高,dpi越高。分辨率相同,屏幕對角線英寸數(shù)越小,dpi越高。

而dp也叫dip,是device independent pixels。設(shè)備不依賴像素的一個單位。在不同的像素密度的設(shè)備上會自動適配,比如:
在320x480分辨率,像素密度為160,1dp=1px
在480x800分辨率,像素密度為240,1dp=1.5px
計算公式:px = dp * (dpi/160)

我們做個簡單的Sample驗證一下,如下,一個布局代碼

    <Button
        android:layout_width="150px"
        android:layout_height="wrap_content"
        android:text="Test px" />
    <Button
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:text="Test dp" />

在480*800分辨率中,3.7屏幕對角線英寸數(shù)的設(shè)備效果圖如下

在480*800分辨率中,5.1屏幕對角線英寸數(shù)的設(shè)備效果圖如下

由此可以看出使用px作為單位的,在不同的設(shè)備中會顯示不同的效果。使用dp作為單位的,會根據(jù)不同的設(shè)備進(jìn)行轉(zhuǎn)化,適配不同機(jī)型。所以建議在長度寬度的數(shù)值使用dp作為單位。

▲ 再舉個栗子 : dp與sp
既然我們在上面說了,dp可以自動適配設(shè)備機(jī)型,那在字體里是否也同樣可行?我們再做個簡單的Sample驗證一下,如下,一個布局代碼

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test dp"
        android:textSize="20dp" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test sp"
        android:textSize="20sp" />

在480*800分辨率中,3.7屏幕對角線英寸數(shù)的設(shè)備效果圖如下

在480*800分辨率中,3.7屏幕對角線英寸數(shù)的設(shè)備下,我們修改手機(jī)系統(tǒng)字體大小,得到效果圖如下

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

▲ 拓展
提供一個工具類:dp與px值轉(zhuǎn)換

public class DensityUtil {

    /**
     * 根據(jù)手機(jī)的分辨率從 dp 的單位 轉(zhuǎn)成為 px(像素)
     */
    public static int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根據(jù)手機(jī)的分辨率從 px(像素) 的單位 轉(zhuǎn)成為 dp
     */
    public static int px2dp(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容