Android尺寸相关

667 阅读4分钟

写于简书2018-03-13 15:20

概念

屏幕尺寸

按屏幕对角测量的实际物理尺寸。 为简便起见,Android 将所有实际屏幕尺寸分组为四种通用尺寸:小、 正常、大和超大。

屏幕密度

屏幕物理区域中的像素量;通常称为 dpi(每英寸 点数)。例如, 与“正常”或“高”密度屏幕相比,“低”密度屏幕在给定物理区域的像素较少。 为简便起见,Android 将所有屏幕密度分组为六种通用密度: 低、中、高、超高、超超高和超超超高。

方向

从用户视角看屏幕的方向,即横屏还是 竖屏,分别表示屏幕的纵横比是宽还是高。请注意, 不仅不同的设备默认以不同的方向操作,而且 方向在运行时可随着用户旋转设备而改变。

分辨率

屏幕上物理像素的总数。添加对多种屏幕的支持时, 应用不会直接使用分辨率;而只应关注通用尺寸和密度组指定的屏幕 尺寸及密度。

密度无关像素 (dp)

在定义 UI 布局时应使用的虚拟像素单位,用于以密度无关方式表示布局维度 或位置。 密度无关像素等于 160 dpi 屏幕上的一个物理像素,这是 系统为“中”密度屏幕假设的基线密度。在运行时,系统 根据使用中屏幕的实际密度按需要以透明方式处理 dp 单位的任何缩放 。dp 单位转换为屏幕像素很简单: px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定义应用的 UI 时应始终使用 dp 单位 ,以确保在不同密度的屏幕上正常显示 UI。

常用单位

  • px:pixel,像素,电子屏幕上组成一幅图画或照片的最基本单元
  • pt: point,点,印刷行业常用单位,等于1/72英寸
  • ppi: pixel per inch,每英寸像素数,该值越高,则屏幕越细腻
  • dpi: dot per inch,每英寸多少点,该值越高,则图片越细腻
  • dp: dip,Density-independent pixel, 是安卓开发用的长度单位,1dp表示在屏幕像素点密度为160ppi时1px长度
  • sp: scale-independent pixel,安卓开发用的字体大小单位。

注:字体的大小用也有用dp的,看需求。 注:不同的方法单位不同。TextView.setTextSize()默认是单位是sp,TextView.setPadding()默认是px。

转换

public class DisplayUtil {

    /**
     * 将px值转换为dip或dp值,保证尺寸大小不变
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 将dip或dp值转换为px值,保证尺寸大小不变
     *
     * @return
     */
    public static int dip2px(Context context, float dipValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dipValue * scale + 0.5f);
    }

    /**
     * 将px值转换为sp值,保证文字大小不变
     */
    public static int px2sp(Context context, float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }

    /**
     * 将sp值转换为px值,保证文字大小不变
     */
    public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }
}

转换的原理

## Dimension

1.最低4位为单位 2.4-7位为radix 3.其他的24位为数值

## 比如10dp


六种通用的密度

ldpimdpihdpixhdpixxhdpixxxhdpi
120px160dpi(基准)240dpi360dpi480dpi640dpi
34681216
240*320320*480480*800720*12801080*1920

图标大小

Launcher Icons Menu Icons

ldpi (120 dpi)mdpi (160 dpi)hdpi (240 dpi)xhdpi (320 dpi)xxhdpi (480 dpi)xxxhdpi (640 dpi)
36px48px72px96px144px192px

Action Bar Icons Status Bar Icons

ldpi (120 dpi)mdpi (160 dpi)hdpi (240 dpi)xhdpi (320 dpi)xxhdpi (480 dpi)xxxhdpi (640 dpi)
18px24px36px48px72px96px

drawable和mipmap区别


drawable中图片和不同设备上的换算

如果放在mdpi文件下的图大小为160像素,那么在hdpi设备上就是240,在xhdpi设备上就是320像素。


字号和高度的换算

如果是以dp为单位,那么12dp在设备上的高度就是12dp。 如果是以sp为单位,那么12sp在设备上的高度就是(12*scaledDensity)dp。 如果是以px为单位,那么当然不会以px为单位。