您的位置:首页 > 移动开发 > Android开发

Android 分辨率 dip dp dpi px sp 详解

2015-04-08 14:10 453 查看
分辨率:

分辨率是和屏幕大小没关的,和手机大小更没关系。分辨率是指单位长度内包含的像素点的数量 它的单位通常为像素每英寸
以您说的分辨率为400*800的屏幕来说, 即一英寸水平线上包含有400个像素点 ,一英寸竖直线上包含有800个像素点。分辨率不仅与显示尺寸有关,还受像素点间距限制,说到这儿你应该明白了,分辨率也是一个比值单位 类似于密度(Kg/m 3)。同样的分辨率480*800, 可能有3寸屏的, 也可能有4寸屏的,他们的清晰度一模一样。 清晰度取决于分辨率,和屏幕大小无关。

现在这里介绍一下dp和sp。dp也就是dip。这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp或sp。但如果设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为160,这时dp和sp和px是一 样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度 设成160px,在密度为320的3.2寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动
将width属性值设置成320px的。也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换。

下面看一下其他单位的含义

px:表示屏幕实际的象素。例如,320*480的屏幕在横向有320个象素,在纵向有480个象素。

in:表示英寸,是屏幕的物理尺寸。每英寸等于2.54厘米。例如,形容手机屏幕大小,经常说,3.2(英)寸、3.5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是3.2英寸,表示手机的屏幕(可视区域)对角线长度是3.2*2.54 = 8.128厘米。读者可以去量一量自己的手机屏幕,看和实际的尺寸是否一致。

mm:表示毫米,是屏幕的物理尺寸。

pt:表示一个点,是屏幕的物理尺寸。大小为1英寸的1/72。

[align=left]换算公式:[/align]
px = (density/160)dp

density一般为3个常用固定值240/160/120

分别对应WVGA/HVGA/QVGA

不知道知己做的分辨率对应的density是多少可以点击AVD Manager里新建一个模拟器或者选择已有的模拟器点details就可以看到了(1.6以上包括1.6才可以查)

补充:dp跟dip是一样的,但px跟dp(dip)绝对不一样,唯一的情况只有在HVGA分辨率下才是一样,因为HVGA分辨率对应density为160,与除数一样,所以做的时候才会没感觉到差别
[align=left]其次,我们在创建一个模拟器的时候,有一个选项是选择模拟器的大小,其实就是选择模拟器的屏幕大小,就是我们常说的分辨率。比如:320*48等。[/align]
[align=left]Density的意思是“密度”。密度,就是说单位面积内的容量大小。[/align]
HVGA屏density=160

QVGA屏density=120

WVGA屏density=240

WQVGA屏density=120
[align=left]density值表示每英寸有多少个显示点,与分辨率是两个概念。[/align]
[align=left]不同density下屏幕分辨率信息:[/align]
480*800的WVGA(density=240)

density=120时 屏幕实际分辨率为240*400 (两个点对应一个分辨率)

横屏是屏幕宽度400px 或者800dip,工作区域高度211px或者480dip

竖屏时屏幕宽度240px或者480dip,工作区域高度381px或者775dip

density=160时 屏幕实际分辨率为320px*533px (3个点对应两个分辨率)

状态栏和标题栏高个25px或者25dip

横屏是屏幕宽度533px 或者800dip,工作区域高度295px或者480dip

竖屏时屏幕宽度320px或者480dip,工作区域高度508px或者775dip

density=240时 屏幕实际分辨率为480px*800px (一个点对于一个分辨率)

状态栏和标题栏高个38px或者25dip

横屏是屏幕宽度800px 或者800dip,工作区域高度442px或者480dip

竖屏时屏幕宽度480px或者480dip,工作区域高度762px或者775dip

apk的资源包中,当屏幕density=240时使用hdpi标签的资源

当屏幕density=160时,使用mdpi标签的资源

当屏幕density=120时,使用ldpi标签的资源。

不加任何标签的资源是各种分辨率情况下共用的。

布局时尽量使用单位dip,少使用px

屏幕 宽度 高度 尺寸 大小 密度

Type (Pixels) (Pixels) Range (inches) Size Group

QVGA 240 320 2.6 - 3.0 Small Low

WQVGA 240 400 3.2 - 3.5 Normal Low

FWQVGA 240 432 3.5 - 3.8 Normal Low

HVGA 320 480 3.0 - 3.5 Normal Medium

WVGA 480 800 3.3 - 4.0 Normal High

FWVGA 480 854 3.5 - 4.0 Normal High

WVGA 480 800 4.8 - 5.5 Large Medium

FWVGA 480 854 5.0 - 5.8 Large Medium

[align=left]屏幕大小和密度对照表 :[/align]



下面是在manifest中设置app在不同分辨率时,是否支持多密度的方法。

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

...

<supports-screens

android:smallScreens="true"

android:normalScreens="true"

android:largeScreens="true"

android:xlargeScreens="true"

android:anyDensity="true" />

< /manifest>



[align=left]3、位图资源的缩放[/align]
[align=left]当对位图资源进行缩放处理时,充分考虑设备的高度和宽度,在程序运行时获取设备的高度和宽度代码如下:[/align]
[align=left]1 2 3 4[/align]

[align=left]WindowManager mWMgrmWMgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);int width = mWMgr.getDefaultDisplay().getWidth();[/align]
[align=left]int height – mWMgr.getDefaultDisplay().getHeight();[/align]

[align=left]下面列举一些强烈推荐的建议:[/align]

在XML布局,使用wrap_content和fill_parent来填充整个父窗口;

使用FrameLayout,而不是AbsoluteLayout,减少界面布局对屏幕大小的依赖;

NEVER use hard-coding for pixel value, use dip (density independent pixel);

根据density和resolution 为不同的设备准备合适的图片资源。

        DisplayMetrics dm = new DisplayMetrics();

        getWindowManager().getDefaultDisplay().getMetrics(dm);

        Log.i("Anqi", "density = "+ dm.density);

        Log.i("Anqi", "densityDpi = "+ dm.densityDpi);

        Log.i("Anqi", "scaledDensity = "+ dm.scaledDensity);

        Log.i("Anqi", "heightPixels = "+ dm.heightPixels);

        Log.i("Anqi", "widthPixels = "+ dm.widthPixels);

        Log.i("Anqi", "xdpi = "+ dm.xdpi);

        Log.i("Anqi", "ydpi = "+ dm.y
4000
dpi);

04-08 16:06:10.384: I/Anqi(3301): density = 1.5

04-08 16:06:10.384: I/Anqi(3301): densityDpi = 240

04-08 16:06:10.385: I/Anqi(3301): scaledDensity = 1.7249999

04-08 16:06:10.385: I/Anqi(3301): heightPixels = 976

04-08 16:06:10.385: I/Anqi(3301): widthPixels = 600

04-08 16:06:10.386: I/Anqi(3301): xdpi = 240.0

04-08 16:06:10.386: I/Anqi(3301): ydpi = 240.0

    public static float applyDimension(int unit, float value,

                                       DisplayMetrics metrics)

    {

        switch (unit) {

        case COMPLEX_UNIT_PX:

            return value;

        case COMPLEX_UNIT_DIP:

            return value * metrics.density;

        case COMPLEX_UNIT_SP:

            return value * metrics.scaledDensity;

        case COMPLEX_UNIT_PT:

            return value * metrics.xdpi * (1.0f/72);

        case COMPLEX_UNIT_IN:

            return value * metrics.xdpi;

        case COMPLEX_UNIT_MM:

            return value * metrics.xdpi * (1.0f/25.4f);

        }

        return 0;

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: