DisplayMetrics metrice= new DisplayMetrics();
Display defaultDisplay = getWindowManager().getDefaultDisplay();
defaultDisplay.getMetrics(metrice);
int densityDpi = metrice.densityDpi;
float density = metrice.density;
int heightPixels = metrice.heightPixels;
int widthPixels = metrice.widthPixels;
float xdpi = metrice.xdpi;
float ydpi = metrice.ydpi;
float scaledDensity = metrice.scaledDensity;
dip:于设备无关的像素值,比如说我在中密度上显示的值为50dip,在低密度的设备上显示的值就为50*0.75=37.5px
px:代表物理像素,比如说在中密度上显示的值为50px,注意单位是px,在其他密度设备上显示的值也是50px
densityDpi :每英寸多少个点
density:densityDpi /160;
drawable-hdpi 高密度,通常是指240也就是上述代码中的densityDpi为240
drawable-ldpi 底密度,通常是指120
drawable-mdpi 中等密度,通常是指160
drawable-xhdpi 超高密度,通常是指320
在drawable-mdpi 里放了一张像素为48*48的图片,把该图片设置成button按钮的背景,在不同密度,不同分辨率的设备下获得的数据如下:
densityDpi=120
density=0.75
heightPixels=320
widthPixels=240
xdpi=120.0
ydpi=120.0
scaledDensity=0.75
intrinsicHeight=36
intrinsicWidth=36
densityDpi=160
density=1.0
heightPixels=480
widthPixels=320
xdpi=160.0
ydpi=160.0
scaledDensity=1.0
intrinsicHeight=48
intrinsicWidth=48
densityDpi=160
density=1.0
heightPixels=768
widthPixels=1024
xdpi=160.0
ydpi=160.0
scaledDensity=1.0
intrinsicHeight=48
intrinsicWidth=48
densityDpi=240
density=1.5
heightPixels=800
widthPixels=480
xdpi=240.0
ydpi=240.0
scaledDensity=1.5
intrinsicHeight=72
intrinsicWidth=72
densityDpi=240
density=1.5
heightPixels=800
widthPixels=480
xdpi=160.42105
ydpi=160.0
scaledDensity=1.5
dimension=75.0
intrinsicHeight=72
intrinsicWidth=72
densityDpi=320
density=2.0
heightPixels=640
widthPixels=960
xdpi=320.0
ydpi=320.0
scaledDensity=2.0
intrinsicHeight=96 //代表图片实际显示的物理像素
intrinsicWidth=96
由此可知,图片的显示和密度之间存在着莫大的关系,在同等密度下不管设别分辨率多大,图片所显示的大小是一样的,在密度不相同的情况下,图片会进行缩放:例如,在中等密度下图片显示高度为48px,低密度下显示的高度为48*0.75=36,图片会进行缩小;在高密度下显示的高度为48*1.5=72,图片会放大;
附:安卓dp和px之间的换算关系
private float px2dip(Context ctx, int pxValue) { return ((float) pxValue * 160) / ctx.getResources().getDisplayMetrics().densityDpi; // 或者 // return pxValue / ctx.getResources().getDisplayMetrics().density; }
private int dip2px(Context ctx, float dpValue) { return (int) (dpValue * ctx.getResources().getDisplayMetrics().density + 0.5f); }
2016.4.17更新:
关于android开发里面的layout文件夹的sw后缀等相关:(drawable-en-rUS-port-160dpi-finger-qwerty-dpad-480 x320/)
android layout文件支持区分不同地区,语言,分辨率,键盘模式等情况下的布局,只需要将不同的布局放置在对应的目录下面即可(不过名字是有先后顺序的,系统会根据配置到相应的目录下自动加载对应的布局)
关于dp,px,dpi的补充:
px1/px2=dpi1/dpi2
选定一个ppi值作为基础绘制图片,用ppi的比值计算出图片缩放比例就可以适配各种屏幕
px2=px1*(dpi2/dpi1)
安卓选定的这个基础值就是160dpi
px2=px1*(dpi2/160)
安卓创造了一个新的单位dp,中文名设备独立像素。并且规定在160ppi的屏幕上,1dp=1px。