做Android开发过程中,总会用到px、dp、pt等概念,下面对它们代表的意义以及互相之间的关系做简单的介绍。
目录
1、px
2、ppi
3、pt
4、dp
5、Android获取屏幕状态信息
1、px 像素
就是一个颜色点,一个像素点,最小的单位。不同的颜色点组成一张图像,因此图像的基本单位是像素px。它是一个相对单位,在不同的密度单位下能变大变小。同样是1英寸的屏幕,密度越大,像素越多,则单个像素的物理尺寸越小。
像素数量px = 像素密度ppi x 屏幕尺寸in
所以在屏幕尺寸一定的情况下,密度越大,像素数量越多,显示效果就会越清晰。看下图:
像素px主要用来描述图像大小和显示器分辨率:
1) 相机所说的像素,其实就是最大像素的意思,像素是分辨率的单位,这个像素值仅仅是相机所支持的有效最大分辨率。
30万 640*480
50万 800×600
80万 1024×768 5” (3.5×5英寸)
2) 我们常说一张100kb大小的图片,指的是图片的体积。一张图像在存储时,会描述每个像素点的颜色信息、位置、数量,这些描述数据就是图片的体积,如果像素越多自然图像体积越大。
2、ppi 像素密度
指的是1英寸屏幕上显示的像素量,密度单位。决定图片的物理显示尺寸,只有涉及到显示才有意义。值越大,显示越细腻。
英寸是使用于联合王国(UK,即英国(英联邦)及其前殖民地的长度单位,一般为1英寸=2.54cm;
像素密度的直观衡量有三个关键指标:
1)每寸像素量:它指的是每平方英寸所含有的像素数量,单位为DPI;
2)像素面积:它指的是屏幕上每个像素占据的物理空间,单位为毫米;
3)像素尺寸:它指的是屏幕上每个像素的尺寸,单位为英寸。
计算公式: ppi=屏幕对角线上的像素量px/对角线长度inch = √(屏幕横向像素^2 + 屏幕纵向像素^2)/对角线长度。
比如 iphone6的ppi是多少?ppi=√(750px²+1334px²)/4.7in=326ppi。
其实我们日常所说的分辨率有两个概念。一个指显示器的分辨率,另一个是图像的分辨率:
1)显示器分辨率指显示器所能显示的像素多少。屏幕尺寸一定时,分辨率越大,像素密度越大,显示器可显示像素越多,画面就越精细。
2)图像分辨率则是单位英寸中所包含的像素点数,比如photoshop里新建画布时设置的图像分辨率是300ppi,其定义更趋近于分辨率本身的定义。
3、pt
这里只说iOS开发时使用的pt,pt是iOS系统的开发单位,而且是长度固定的,不随屏幕像素密度ppi变化而变化。
苹果公司规定:普屏时1px=1px,而普屏的ppi=163像素/英寸,那么pt=1/163英寸=0.16mm(固定值)。普屏1px=1px,高清屏1pt=2px。
用固定长度pt作为开发单位的好处是,这样可以保证同一张图片在不同设备上显示大小一样,因为pt值是固定的。高清屏上1pt等于更多的像素px,因为像素在高清屏上变小,所以pt还是固定的。
4、dp
dp是安卓的开发单位,也是一个固定长度的单位。
根据不同的屏幕分辨率,和px有不同的倍数关系。规定: 1dp等于屏幕像素密度为160ppi时1px的长度。
公式:1dp = (屏幕ppi/160)px。
现在我们知道,mdpi就是屏幕像素密度为160,那么就以它为标准吧,这些屏幕密度的比值是 ldpi : mdpi : hdpi : xhdpi : xxhdpi = 0.75 : 1 : 1.5 : 2 : 3。
安卓中清屏 1dp = 1px 高清屏 1dp = 1.5px 超清屏 1dp = 2px
一般做设计的时候以xhdpi为模板,xhdpi条件下 1dp = 2px,标注长度的时候,将长度像素除以2即为dp值,方便沟通。
在Android中像素密度可以通过下面的方式获取:
getResources().getDisplayMetrics().densityDpi
所以px与dp的转换方式如下:
public static float pxToDp(float px) {
dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
float densityDpi = dm.densityDpi;
return px / (densityDpi / 160f);
}
public static int dpToPx(float dp) {
dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
float density = dm.density;
return Math.round(dp * density);
}
5、Android获取屏幕状态信息
1)可以用过adb获取到屏幕的一些参数信息:
使用adb修改屏幕像素密度 (此命令针对全志开发板子)
adb shell am display-density 120
获取Android设备屏幕分辨率:
adb shell wm size
获取android设备屏幕密度:
adb shell wm density
修改屏幕像素密度
adb shell wm resize 1920*1080
adb shell wm size 540×960
重置屏幕尺寸大小
adb shell wm size reset
设置屏幕dpi (常用的dpi有160mdpi, 240hdpi, 320xhdpi, 480xxhdpi)
adb shell wm density 320
重置可用dpi如下命令
adb shell wm density reset
2)Android中通过方法获取屏幕信息的方法如下:
private String getScreenParams() {
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int heightPixels = dm.heightPixels;//高的像素
int widthPixels = dm.widthPixels;//宽的像素
int densityDpi = dm.densityDpi;//dpi
float xdpi = dm.xdpi;//xdpi
float ydpi = dm.ydpi;//ydpi
float density = dm.density;//density=dpi/160,密度比
float scaledDensity = dm.scaledDensity;//scaledDensity=dpi/160 字体缩放密度比
float heightDP = heightPixels / density;//高度的dp
float widthDP = widthPixels / density;//宽度的dp
String str = "heightPixels: " + heightPixels + "px";
str += "\nwidthPixels: " + widthPixels + "px";
str += "\ndensityDpi: " + densityDpi + "dpi";
str += "\nxdpi: " + xdpi + "dpi";
str += "\nydpi: " + ydpi + "dpi";
str += "\ndensity: " + density;
str += "\nscaledDensity: " + scaledDensity;
str += "\nheightDP: " + heightDP + "dp";
str += "\nwidthDP: " + widthDP + "dp";
return str;
}
//打印信息
heightPixels: 2235px
widthPixels: 1080px
densityDpi: 480dpi
xdpi: 391.885dpi
ydpi: 412.75dpi
density: 3.0
scaledDensity: 3.0
heightDP: 745.0dp
widthDP: 360.0dp