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程序就支持了多种分辨率,那么就可以得到正确的物理尺寸了。

原文地址:https://www.cnblogs.com/cbx17v/p/7156209.html