PX、DP和SP之間的換算

這裏寫圖片描述

在Android開發中,尺寸換算可以說既簡單又複雜,而且還比較碎,特別是屏幕適配的時候肯定會用到他們。今天就來總結一下他們三者的關係,首先說下他們都是什麼。

px:像素單位。最基礎的圖像構成元素單位
dp:與密度無關的像素,這是一個基於屏幕物理密度的抽象單位。
這裏要解釋一下密度的概念,密度(dpi):每英寸包含的像素個數(單位是dpi),1dp實際上相當於密度爲160dpi的屏上的一個點。可否理解爲物理尺寸?也就是說,如果屏幕物理密度是160dpi時,dp和px是等效的。
換算公式 1: px = dp * (dpi / 160)
sp:同dp相似,但還會根據用戶的字體大小偏好來縮放(建議使用sp作爲文本的單位,其它用dip)

咱們廢話不多說,直接上表格,通過這個表格你會非常快速的定位到你要找的內容。


寬×高(標準值) 240×320 320×480 480x800 720x1280 1080x1920 1440×2560
DPI等級 LDPI MDPI HDPI XHDPI XXHDPI XXXHDPI
DPI數值 (density) 120 160 240 320 480 640
對應比例 3 4 6 8 12 16
1DP=?PX 0.75 1 1.5 2 3 4

注:density值表示每英寸有多少個顯示點,與分辨率是兩個概念。
MDPI爲baseline,其他均以此爲基準,在此設備上,1dp = 1px

下面附上開發中用到的dp和px相互轉換的工具類。sp和dp在開發中是同等對待的,只是sp是用來對文字的大小的。其他的全用dp就好。


    import android.content.Context;  

    public class DensityUtil {  

        /** 
         * 根據手機的分辨率從 dp 的單位 轉成爲 px(像素) 
         */  
        public static int dip2px(Context context, float dpValue) {  
            final float scale = context.getResources().getDisplayMetrics().density;  
            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);  
        }  
    }  

這個工具類在網上一大推,而且基本都一樣,加0.5f是有個偏移值,確保精度不流失。scale是在這個類DisplayMetrics中定義的全局變量,其實這個值就是當前手機的density/160。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章