android计算屏幕dp
首先我们来了解一些基本元素:
px:像素,屏幕上的点。
dpi:一英寸长的直线上的像素点的数量,即像素密度。标准值是160dp。
/**
* 正是因为dpi值其代表的特性,所以android项目的资源文件下存在以下目录:
drawable-ldpi ( 当dpi为120时,使用此目录下的资源)
drawable-mdpi ( 当dpi为160时,使用此目录下的资源)
drawable-hdpi ( 当dpi为240时,使用此目录下的资源)
drawable-xhdpi ( 当dpi为320时,使用此目录下的资源)
drawable-xxhdpi ( 当dpi为480时,使用此目录下的资源)
Android正是根据设备DPI值得不同,选择清晰度不同的资源使用,完成屏幕的适配。
*/
dp(dip):独立像素密度。即在标准屏幕下,1个像素点的长度,标准屏幕是160dpi,可以理解为1英寸长度上有160个像素。标准屏幕中1dp=1px。
px(像素) = dp(独立像素密度) * (dpi(像素密度) / 160)
分辨率:屏幕上长宽方向上像素点的数量,即一个屏幕上像素的数量。
例如:720*1280 = 屏幕x轴上有720个像素,屏幕y轴上有1280个像素
分辨率单位:dpi(点每英寸)、lpi(线每英寸)、ppi(像素每英寸)
屏幕的物理尺寸:屏幕对角线的长度,单位是inch
sp:专用于设定文字大小,受dpi影响和用户的字体偏好设定影响。
下面我们来计算屏幕dp:
1 DisplayMetrics metrics = new DisplayMetrics();
2 getWindowManager().getDefaultDisplay().getMetrics(metrics);
3 int screenHeight = metrics.heightPixels;//屏幕高度像素
4 int screenWidth = metrics.widthPixels;//屏幕宽度像素
5 //density = densityDpi / 160
6 float density = metrics.density;// "屏幕密度"(0.75 / 1.0 / 1.5)
7 int densityDpi = metrics.densityDpi;// 屏幕密度dpi(120 / 160 / 240)每一英寸的屏幕所包含的像素数.值越高的设备,其屏幕显示画面的效果也就越精细
8 // 屏幕宽度算法:屏幕宽度(像素)/"屏幕密度" px = dp * (dpi / 160)
9 int height = (int) (screenHeight / density);//屏幕高度dp
但是,需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。比如说,一部240x320像素的低密度手机,如果运行上述代码,获取到的屏幕尺寸是320x427。因此,研究之后发现,若没有设定多分辨率支持的话,Android系统会将240x320的低密度(120)尺寸转换为中等密度(160)对应的尺寸,这样的话就大大影响了程序的编码。所以,需要在工程的AndroidManifest.xml文件中,加入supports-screens节点,具体的内容如下:
1 <!-- 得到屏幕正常的物理尺寸 --> 2 <supports-screens 3 android:anyDensity="true" 4 android:largeScreens="true" 5 android:normalScreens="true" 6 android:resizeable="true" 7 android:smallScreens="true" />
这样的话,当前的Android程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了。