首先介绍PPI(DPI),PPI和DPI其实都是相同的一个概念,只不过DPI是dots per inch和 PPI是pixels per inch。
一般我们说的5寸手机,5.5寸手机指的是手机屏幕对角线的长度。
根据勾股定理计算出对角线上的像素点个数,用来除以手机尺寸,即可得到PPI(DPI)值。
比如:
5寸,1920x1080分辨率,PPI=√(1920*+1080*)/5=440.5814340164597=441;
5.7寸,1920x1080分辨率,PPI=√(1920*+1080*)/5.7=386.4749421197015=387。
每个android手机的PPI(DPI)已经固定在rom里面了,一般不可以改变,可以通过DisplayMetrics类获取手机的DPI:
DisplayMetricsdisplayMetrics=getResources().getDisplayMetrics();
System.out.println("densityDpi:"+displayMetrics.densityDpi);
DPI对应DisplayMetrics类中的densityDpi,DisplayMetrics类的属性如下;
每个不同尺寸不同分辨率的手机,DisplayMetrics类中的density,scaledDesity等值都是不同的。
android中的dp,sp计算规则出自TypedValue类中,代码如下:
public static float applyDimension(int unit, float value,DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}