来源:http://blog.csdn.net/guolin_blog/article/details/50727753
最简单的办法是把dp理解成实际物理单位,和英寸、毫米等一样(1dp等于1/160英寸),好处是它和像素之间好换算,且结果是整数。
float ydpi = getResources().getDisplayMetrics().ydpi;
其中xdpi代表屏幕宽度的dpi值,ydpi代表屏幕高度的dpi值,通常这两个值都是近乎相等或者极其接近的,在我的手机上这两个值都约等于403。那么403又代表着什么意思呢?我们直接参考下面这个表格就知道了:
dpi范围 密度
0dpi ~ 120dpi ldpi
120dpi ~ 160dpi mdpi
160dpi ~ 240dpi hdpi
240dpi ~ 320dpi xhdpi
320dpi ~ 480dpi xxhdpi
480dpi ~ 640dpi xxxhdpi
缩放公式:缩放后大小= 图片实际大小 × (手机密度/图片密度)
其中图片密度由图片所在drawable文件夹的后缀决定
比如一张100X100的图放在mdpi文件夹里,在hdpi的手机上,缩放后大小= 100 * (1.5/1) = 150
就成了一张150*150的图片。
就目前来讲,最佳放置图片资源的文件夹就是drawable-xxhdpi。那么有的朋友可能会问了,不是还有更高密度的drawable-xxxhdpi吗?干吗不放在这里?这是因为,市面上480dpi到640dpi的设备实在是太少了,如果针对这种级别的屏幕密度来设计图片,图片在不缩放的情况下本身就已经很大了,基本也起不到节省内存开支的作用了。
drawable文件夹的效果等同于drawable-mdpi文件夹。
* 在1080电视中layout-1920x1080布局526dp 340dp变成789px 510px 变大了1.5倍
* 在720电视中layout-1280x720布局526dp 340dp变成526px 340px 比例1:1
720px/10英寸=72dpi
1080px/10.8英寸=100dpi
100dp *(72/160) =45px
100dp *(100/160) =10000/160=62.5px
45px/72dpi=0.625英寸
62.5px/100dpi=0.625英寸
相同100dp的控件在不同分辨率(720和1080)且不同物理尺寸(10和10.8)的手机中,其100dp所代表的在手机中的物理长度都是0.625英寸。
当40寸和43寸电视,其屏幕分辨率都是1080*720的时候,40寸的总dp要小一点,像素密度dpi要大一点。
在程序运行时,系统根据屏幕的实际密度透明的处理任何需要缩放的设备独立像素单元,设备独立像素转换成屏幕实际像素的换算很简单:
px = dp * (dpi/ 160).
对这个公式解释:
例如:屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),Android API 说,如果屏幕密度为160,这时dp和px是一样的。1dp=1px; 例如 有一张定义为“100dp”的图片,在像素密度中(160dpi,也就是说240*320)手机上实际显示100px,如果你换成高(240dpi)上,那么就会显示 240/160 *100=150px
如果你把图片定义为 “100px”,在像素密度中(160dpi)显示是一样的,如果换高(240dpi),它每英寸放的像素的数量多,只用图片长度的一半就把一张图片放下了,看起来就短了一半,所以通常用dp