在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。