Android中DP、DPI以及PX概念

来源:互联网 发布:晚清民国报刊数据库 编辑:程序博客网 时间:2024/06/05 03:33

Android开发中布局经常使用dp、sp以及px等,而且UED同学也会使用px设计视觉稿,我们在使用的时候要转换为dp,但具体为什么,很多开发人员还不是很清楚。同时Android开发涉及到不同图片资源文件夹比如Drawable、Drawable-dpi以及Drawable-xhdpi,这个又是怎么区别以及使用呢?看了这篇文章之后可能你就会恍然大悟了、、
-
DP、PX等概念

DP=DIP(Device-independent pixel,设备独立像素)。可作长度单位,不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。dip和具体像素值的对应公式是dip值 =设备密度/160* pixel值,可以看出在dpi(像素密度)为160dpi的设备上1px=1dip。这里如果不理解,就记住是设备独立像素就行啦。
PX=Pixel(像素)这里的“相同”是指像素数不会变,比如指定UI长度是100px,那不管分辨率是多少UI长度都是100px。也正是因为如此才造成了UI在小分辨率设备上被放大而失真,在大分辨率上被缩小。
DPI (dots per inch像素密度)指每英寸中的像素数。如160dpi指手机水平或垂直方向上每英寸距离有160个像素点。假定设备分辨率为320*240,屏幕长2英寸宽1.5英寸,dpi=320/2=240/1.5=160。这个在接口api中是densityDpi
Resolution(分辨率)指手机屏幕垂直和水平方向上的像素个数。比如分辨率是480*320,则指设备垂直方向有480个像素点,水平方向有320个像素点。
Screen Size(屏幕尺寸) 一般所说的手机屏幕大小如1.6英寸、1.9英寸、2.2英寸,都是指的对角线的长度,而不是手机面积。我们可以根据勾股定理获取手机的宽和长,当然还有面积。
Density指每平方英寸中的像素数。Density=Resolution/Screen size
SP(Scaled Pixels 放大像素)主要用于字体显示(best for textsize)。根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。现在大多数公司开发都使用DP来设置字体大小,主要是因为dp不会随着系统字体大小改变而变化,而sp会随用户设置系统字体而变化。

 **这些数据可以通过下面的代码获取**

DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;
densityDpi = dm.densityDpi;
scale = dm.density;
fontScale = dm.scaledDensity;

  • PX与DP、SP转换

    对上面那么多的常用单位了解之后,接下来就是怎么计算他们之间的关系了。开发中老司机一般都会使用DP作为图片以及字体的大小,因为DP是设备独立像素,就是说可以自动适配不同的屏幕(话说Android手机屏幕大小各种各样啊!!)。但是UED一般给我们的视觉稿都使用的px。。。。

    首先计算手机的DPI,DPI=手机分辨率1200(×1920)/手机宽(长)分别对应的计算就行了,一般手机的长宽我们不知道,不过还好我们知道手机的尺寸比如 我们说的5寸屏 就是手机屏幕对角线的长度,一般可以百度出来手机的屏幕大小(单位是英寸,所以如果我们用尺子量的话应转为英寸)。那么通过高中学的勾股定理可以计算对角线的像素点的个数Sum=√(1200*1200+1920*1920),然后DPI = Sum/5;而densityDpi = DPI/160,除160是因为160是最初设计的标准,好像是HTC手机作为标准而定的。

    然后px = density* DP,通过这个公式我们就可以计算出DP了,而density不同手机可能不同所以我们通常采用折中的方式 和视觉协商 ,按照720*1280来设计的,则手机的屏幕密度为2,这样我们只要拿到视觉稿的30px 然后直接30/2 就是我们想要的dp值了。

这里写图片描述

运行时,布局中的dp最终都会根据不同手机转化为px,然后根据density比例值计算,从而可以达到独立设备的效果。我们经常使用getPixelFromDip,看下源码:

public static int getPixelFromDip(DisplayMetrics dm, float dip) {        return (int)(TypedValue.applyDimension(1, dip, dm) + 0.5F);}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;//density就是我们计算的那个比例值        case COMPLEX_UNIT_SP:            return value * metrics.scaledDensity;//scaledDensity和density一个意思        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;    }
  • Android工程工程中Drawable、Drawable-hdpi以及drawable-xhdpi区别

    我们在开发过程中经常会用到图片,并且有时候为了适配会做好几套图片,但是大的app都会有size要求,所以我们开发 难啊!!!那么为了适配并且减少size,我们首先了解一下,图片加载到内存到展示的情况。

    开发中不同drawableDpi比如

    这里写图片描述

    drawable对应的dpi=160;drawable-hdpi对应240 ;drawable-xhdpi对应320.以此类推

    图片占用内存=加载到内存实际宽实际长(像素)每个像素的占用字节(ARGB_8888、ARGB_4444、ARGB_565等);
    实际的长和宽=原始长宽*缩放比(手机dpiDensity/所在文件夹dpi),dpiDensity就是上面提到的DPI


决定 Bitmap 占用内存大小的因素,和图片文件在磁盘上占用的空间一点关系都没有,总结来说,有以下几点:
● 色彩格式:比如 ARGB_8888 、RGB_5555 这种,单位像素占的内存空间不同。
● 图片本身的像素尺寸。
● 图片文件存放的 Drawable 目录。xhdpi 和 xxhdpi 可是不一样的。
● 目标设备的 densityDpi 值。

参考文章:那些值得你去细细研究的Drawable适配

原创粉丝点击