6.1 屏幕尺寸信息

1.屏幕参数

屏幕大小:指屏幕对角线的长度,通常用“寸”来度量。例如 5.5寸手机。(1英寸=2.54厘米)
分辨率:指手机屏幕的像素点个数,例如720x1280,指宽有720个像素点,高有1280个像素点。
PPI:每英寸像素(Pixels Per Inch)又被称为DPI(Dots Per Inch)。它是有对角线的像素点除以屏幕的大小得到的,通常达到400PPI就算是比较高的屏幕密度了。

2.独立像素密度dp

Android系统使用mdpi即密度值为160的屏幕作为标准,在这个屏幕上1dp=1px,其他屏幕通过比例换算如下表。

宽×高(标准值) 240×320 320×480 480×800 720×1280 1080×1920 1440×2560
DPI等级 LDPI MDPI HDPI XHDPI XXHDPI XXXHDPI
DPI数值( 120 160 240 320 480 640
对应比例 3 4 6 8 12 16
1DP=?PX (density) 0.75 1 1.5 2 3 4

另:density和PPI的关系:density = ppi/160 = dpi/160
px = dp x density = dp x (dpi/160)
以上均为16:9的手机屏幕,18:9的手机主流分辨率为1080*2160
当控件在对应的文件夹中没有找到,就从高分辨率的文件夹依次向低分辨率的文件夹中寻找

3.单位转换工具类

public class DisplayUtil {
/**
 * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
 * <p>
 * fontScale DisplayMetrics类中属性 density
 */
public static int dip2px(Context context, float dpValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dpValue * scale + 0.5f);
}

/**
 * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
 * <p>
 * fontScale DisplayMetrics类中属性 density
 */
public static int px2dip(Context context, float pxValue) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (pxValue / scale + 0.5f);
}

/**
 * 根据手机的分辨率从 sp 的单位 转成为 px(像素)
 * <p>
 * fontScale DisplayMetrics类中属性 scaledDensity
 */
public static int sp2px(Context context, float spValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (spValue * fontScale + 0.5f);
}

/**
 * 根据手机的分辨率从 px(像素) 的单位 转成为 sp
 * <p>
 * fontScale DisplayMetrics类中属性 scaledDensity
 */
public static int px2sp(Context context, float pxValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (pxValue / fontScale + 0.5f);
}

/**
 * dp2px
 */
public static int dpTopx(Context context, float dpValue) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
            dpValue,
            context.getResources().getDisplayMetrics());
}

/**
 * sp2px
 */
public static int spTopx(Context context, float spValue) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
            spValue,
            context.getResources().getDisplayMetrics());
}
}

推荐阅读更多精彩内容