先上一个网上copy的

px:是屏幕的像素点

in:英寸

mm:毫米

pt:磅,1/72 英寸

dp:一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px

dip:等同于dp

sp:同dp相似,但还会根据用户的字体大小偏好来缩放。

建议使用sp作为文本的单位,其它用dip

然后是我自己的理解:

Android的屏幕密度是以160为基准的,

屏幕密度(densityDpi)为160时, 是将一英寸分为160份, 每一份是1像素. 如果屏幕密度(densityDpi)为240时, 是将一英寸分为240份, 每一份是1像素. 1英寸/160(机器x) = 1英寸/240(机器y) = 1px

打个比方, 一个三英寸的显示屏幕的机器, 如果屏幕密度(densityDpi)为160, 即密度比(density)1.0时, 画一条160dip和160px的线条, 两个都是1英寸. 可如果还是三英寸的屏幕, 如果屏幕密度(densityDpi)变为320, 即密度比(density)2.0时,1英寸有320像素了, 此时160px显示就是半英寸. 160dip显示还是1英寸, 因为 1dip = 1px * density .

可是你有没有注意到, 同样宽的屏幕, 比如3英寸, 如果density 是1.0的话, 分辨率就是480dip*x或480px,*x 如果还是3英寸的, density 是1.5的话 , 分辨率就是480*1.5 = 720px*x 或480dip*x. (这里的x代表屏幕的高度). 如果同样是240dip, 在两款机器上显示都是一半的长度, 这样就保证了比例. 这样的话如果是480分辨率和720分辨率的话, 可以采用同一个布局文件了.

又但可是, 我见过的机器只有320*240(0.75) , 480*320(1.0) , 800*480(1.5), 854*480(1.5) , 如果是480 和 800 两个版本, 同一条线480dip , 480显示全屏, 800则显示 480 / (800 / 1.5) 屏 . 其中800/1.5是屏幕的总dip . 我们平时说的分辨率都是以像素px为单位的.

由此可见, 就算是用dip, 也不能保证不同分辨率的机器的布局比例完全一样. 但还是有好处的. 因为如果是用px的话, 有些时候一些布局直接跑到了屏幕外边, 调试起来很麻烦.

还有, google代码里边所用的单位都是以px为默认单位的.

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

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

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

在每英寸160点的显示器上,1dp = 1px。

下面是几种不同单位的相互转换.

publicstaticintdip2px(Context context, float dipValue){
final float scale=context.getResources().getDisplayMetrics().density;
return (int)(dipValue*scale+0.5f);
}
publicstaticintpx2dip(Context context, float pxValue){
final float scale=context.getResource().getDisplayMetrics().density;
return (int)(pxValue/scale+0.5f);
}
publicstaticintdip2px(Context context, float dipValue){
final float scale=context.getResources().getDisplayMetrics().density;
return (int)(dipValue*scale+0.5f);
}
publicstaticintpx2dip(Context context, float pxValue){
final float scale=context.getResource().getDisplayMetrics().density;
return (int)(pxValue/scale+0.5f);
}

下面说下如何获取分辨率:

在一个Activity的onCreate方法中,写入如下代码:
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels;// 屏幕宽度(像素)
int height = metric.heightPixels;// 屏幕高度(像素)
float density= metric.density;// 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi;// 屏幕密度DPI(120 / 160 / 240)
这还是挺简单的, 可是你有没有在800*480的机器上试过, 是不是得到的宽度是533 ? 因为android刚开始时默认的density是1.0 , 此时你可以再manifest.xml中加入

1.uses-sdk节点,<uses-sdk android:minSdkVersion="4" /> , 表示不sdk1.6以下的机器不能安装你的apk了.

2.supports-screens 节点.

<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" />

更多相关文章

  1. Android(安卓)屏幕适配解决方案汇总
  2. dp
  3. Android重力感应示例
  4. Android(安卓)屏幕适配问题
  5. [转]修改Android的自带程序“屏幕锁”
  6. Android屏幕适配简单总结,PT适配方案
  7. Android(安卓)Resource
  8. 对Android屏幕知识的学习总结
  9. Android(安卓)APP适配全面屏手机的技术要点

随机推荐

  1. Linux下Android(安卓)SDK中adb找不到的解
  2. Android(安卓)蓝牙开发(九)A2DP基本功能
  3. Android(安卓)SDK下载和更新失败的解决方
  4. ScrollView拉到尽头时出现阴影的解决方法
  5. Android(安卓)访问Webservice接口,参数对
  6. Android(安卓)导入项目时遇到的JNI和NDK
  7. android 2.3 wifi (二)
  8. Android(安卓)Camera对焦相关
  9. android从sdcard加载.9.png图片
  10. android 连接服务器的方法及安全性问题